Is it necessary to destroy the TEdit when editing is done? Simply hiding or disabling it would be much simpler.
Basically you destroy a control by calling its Free method: edLabelEdit.Free. If, however, there is a chance that the control will be used later, e.g. by calling CreateLabelEditbox again, you must set edLabelEdit to nil after destruction, in short: FreeAndNil(edLabelEdit). Note that in every access to it you must check against nil.
Setting the variable to nil is particularly important when you create the instance with an owner like you do. Your "edLabelEdit := TEdit.Create(self)" makes the form ("self") the owner of the edLabelEdit, and thus the form automatically destroys the edit when the form itself is destroyed. But when you destroyed the edit yourself during the lifetime of the application and did not set it to nil the form will still attempt to destroy it again - and your application will crash, because the variable edLabelEdit points to invalid memory.
You should also protect the procedure CreateLabelEditBox from creating the edLabelEdit a second time:
procedure TForm1.CreateLabelEditBox(aObject:TControl; aOnEditingDone: TNotifyEvent);
begin
if edLabelEdit = nil then
edLabelEdit:=TEdit.Create(self);
edLabelEdit.Left:=aObject.Left;
edLabelEdit.Top:=aObject.top;
edLabelEdit.BorderStyle:=bsNone;
edLabelEdit.Height:=aObject.Height;
edLabelEdit.Width:=aObject.Width;
edLabelEdit.Color:=RGBToColor(100,100,100);
edLabelEdit.OnEditingDone:=aOnEditingDone;
edLabelEdit.Font:=aObject.Font;
edLabelEdit.Parent:=self;
edLabelEdit.SetFocus;
end;