Skip to content

Instantly share code, notes, and snippets.

@jimmckeeth
Last active August 5, 2020 20:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jimmckeeth/85436af28c378b547dbffd05d5df1ddc to your computer and use it in GitHub Desktop.
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)
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