Pues debes iniciar una transacción cuando pretendan editar el registro.
Luego haces un update sencillo para que se bloquee, por ejemplo:
Código:
AdoConnection1.BeginTrans;
with AdoQuery1 do
begin
SQL.Close;
SQL.Clear;
SQL.Add('update Clientes');
SQL.Add('set Id_Cliente = Id_Cliente');
SQL.Add('where Id_Cliente = ' + IntToStr(iCliente));
ExecSQL;
end;
Con esto garantizas que se genera un bloqueo, y a los demás usuarios que intenten entrar a modificar este registro, les marcará el error de "tiempo de espera" mientras no hayas confirmado o cancelado la transacción.
Luego, al momento de guardar, haces tus updates yliberas el bloqueo (confirmando la transacción):
Código:
with AdoQuery1 do
begin
SQL.Close;
SQL.Clear;
SQL.Add('update Clientes');
SQL.Add('set Nombre = :Nombre,');
...
SQL.Add('where Id_Cliente = ' + IntToStr(iCliente));
ExecSQL;
end;
AdoConnection1.CommitTrans;
El inconveniente es que, si el usuario da click al botón de "modificar" y se va y se toma un café (o hay quienes duran 30 minutos cuando van al baño) el bloqueo estará ahí, esperando a que el usuario lo libere o alguien con acceso al SQL Server lo mate. Sin embargo, eso es lo que hay de bloqueos para SQL Server.