Last active
August 5, 2020 20:31
-
-
Save jimmckeeth/85436af28c378b547dbffd05d5df1ddc to your computer and use it in GitHub Desktop.
Simple CustomManagedRecords routine to automatically re-enable the OnChange event handler for FireMonkey edits (see blog post)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
unit IgnoreEditChanges; | |
// https://blogs.embarcadero.com/ignore-changes-with-custom-managed-records/ | |
// Custom Managed Records are a new feature introduced in 10.4 Sydney | |
interface | |
uses | |
System.Classes; | |
type | |
TIgnoreEditChanges = record | |
private | |
FEdit: TObject; | |
FOnChange: TNotifyEvent; | |
public | |
constructor Create(const AnEdit: TObject); | |
class operator Initialize(out ADest: TIgnoreEditChanges); | |
class operator Finalize(var ADest: TIgnoreEditChanges); | |
class operator Assign(var ADest: TIgnoreEditChanges; | |
const [ref] ASrc: TIgnoreEditChanges); | |
end; | |
implementation | |
uses | |
FMX.Controls, FMX.Edit, FMX.DateTimeCtrls, FMX.ComboEdit, FMX.Memo; | |
constructor TIgnoreEditChanges.Create(const AnEdit: TObject); | |
begin | |
Assert(Assigned(AnEdit)); | |
FEdit := AnEdit; | |
if FEdit is TCustomEdit then | |
begin | |
FOnChange := TCustomEdit(AnEdit).OnChange; | |
TCustomEdit(AnEdit).OnChange := nil; | |
end | |
else if FEdit is TCustomDateTimeEdit then | |
begin | |
FOnChange := TCustomDateTimeEdit(AnEdit).OnChange; | |
TCustomDateTimeEdit(AnEdit).OnChange := nil; | |
end | |
else if FEdit is TCustomMemo then | |
begin | |
FOnChange := TCustomDateTimeEdit(AnEdit).OnChange; | |
TCustomMemo(AnEdit).OnChange := nil; | |
end | |
else | |
raise EInvalidOperation.Create( | |
'TIgnoreEditChanges does not support objects of type ' + AnEdit.ClassName); | |
end; | |
class operator TIgnoreEditChanges.Initialize(out ADest: TIgnoreEditChanges); | |
begin | |
ADest.FEdit := nil; | |
end; | |
class operator TIgnoreEditChanges.Finalize(var ADest: TIgnoreEditChanges); | |
begin | |
if Assigned(ADest.FEdit) then | |
begin | |
if ADest.FEdit is TCustomEdit then | |
TCustomEdit(ADest.FEdit).OnChange := ADest.FOnChange | |
else if ADest.FEdit is TCustomDateTimeEdit then | |
TCustomDateTimeEdit(ADest.FEdit).OnChange := ADest.FOnChange | |
else if ADest.FEdit is TCustomMemo then | |
TCustomMemo(ADest.FEdit).OnChange := ADest.FOnChange | |
end; | |
end; | |
class operator TIgnoreEditChanges.Assign(var ADest: TIgnoreEditChanges; | |
const [ref] ASrc: TIgnoreEditChanges); | |
begin | |
raise EInvalidOperation.Create( | |
'TIgnoreEditChange records cannot be copied.') | |
end; | |
end. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment