1. Убрать вот это из цикла:
Код:
Form3.Repaint;
StringGrid2.Repaint;
2. проверить, если где у StringGrid методы BeginUpdate и EndUpdate. Если есть - использовать.
3. Грузить не из DBGrid, а из самого запроса (что ты собственно и делаешь, только обращаешься к нему через DBGrid). Мелочь, но на больших числах тоже начинает играть.
4. Где можно, использовать With..do - тоже сокращение времени на разрешение ссылок.
3 и 5 - это уже мелочевка, много тут не выиграешь.
И это только просто посмотрев на твой код. Надо еще бы по алгоритму пройтись, может можно как-то ограничить выборку.
Так что переписывать все-равно придется.
Только непонятно - чем тебя DBGrid не устраивает, что ты переписываешь данные в StringGrid. Зачем их лишний раз перекладывать?