В событии OnChange этот код работает и когда выдлен весь текст.
Код:
procedure TForm1.Edit1Change(Sender: TObject);
var
S : TCaption;
P : Integer;
begin
if Length(Edit1.Text) > 0 then begin
P := Edit1.SelStart;
S := AnsiUppercase(Edit1.Text[1]) + Copy(Edit1.Text, 2, 255);
Edit1.Text := S;
Edit1.SelStart := P;
end;
end;
А в OnKeyPress когда нажимается символьная клавиша после того как отмечен весь текст, в Text еще сидит вся отмеченная строка, потому и не срабатывает условие Length(Edit1.Text) < 1.