Например можно попробовать так:
Начинается цикл. Текущую клетку (координаты X и Y) закрашиваем. Смотим соседа слева (если имеется таковой).
Если его цвет нужный, то в массив (самодельный стек) заносим например 0 (чтоб знать что пришли слева), потом X уменьшаем на 1. Если же цвет не тот или нет соседа слева - аналогично для права, потом верха и потом низа, только заносить будем соответственно 1, 2 или 3.
Следующий проход цикла - имеем новые координаты, и делаем все то же для них.
Если у N-ной клетки не оказалось соседей - берем из массива направление, откуда пришли, и возвращаемся по нему, не выполняя сравнения для тех сторон, которые уже были (если например вернулись с цифрой 2, значит остается сравнить только для направления 3).
Как-то так. Довольно сложная комбинация IF-ов. Проще рекурсией.
Код:
procedure Paint(x,y:byte);
begin
//с DrawGrid не работал, не знаю как он там внутри устроен, напишу для массива.
a[x,y]:=Color2;
if x<Nx-1 then
if a[x+1,y] = color1 then
Paint(x+1,y);
if x>0 then
if a[x-1,y] = color1 then
Paint(x-1,y);
if y<Ny-1 then
if a[x,y+1] = color1 then
Paint(x,y+1);
if y>0 then
if a[x,y-1] = color1 then
Paint(x,y-1);
end;
По идеи так не должно слетать. Стек прогружается одним вызовом на 6 байт, для DrawGrid 20x20 максимум будет 2400 байт.