Yeah, same event handler can be used for different controls, if procedure declaration (i.e. number of parameters) is the same. But you need to check Sender's type then. It can be done via "is" operator.
if Sender is TEdit then...
There are two ways to cast Sender to other class: with and without type check. If you've already verified it's type, then cast without type check can be performed. It's "free" operation, because for processor all pointers are untyped.
var Edit:TEdit;
begin
Edit := TEdit(Sender);
Cast with type check is performed via "as" operator and will rise exception if type doesn't match or control's class isn't inherited from desired class.
var Edit:TEdit;
begin
Edit := Sender as TEdit;
This operation isn't "free", because it implies built-in type check via "is" operator. Then code's logic can be based on exception handling, rather than on explicit type check.
try
Edit := Sender as TEdit;
//It's TEdit!
except
//It's not TEdit!
end;