Да, так, только надо проверять, что в Edit1 и в Edit2 что-то есть, а так же кол-во символов, т.к. приведенный способ позволяет заменить исключительно один символ, если надо менять один символ на несколько или несколько на несколько, то надо делать подругому.
Код:
var
S : TStringList;
A : String;
C1, C2 : Char
begin
If Length(Edit1.Text) <> 1
Then Raise Exception.Create('Первый символ для замены пустой или их больше 1');
If Length(Edit2.Text) <> 1
Then Raise Exception.Create('Второй символ для замены пустой или их больше 1');
C1 := Copy(Edit1.Text,1,1)[1];
C2 := Copy(Edit2.Text,1,1)[1];
S := TStringList.Create;
Try
S.LoadFromFile(AFileName); // В переменной AFileName - полное имя файла
If S.Count < 18 Then Raise Exception.Create('Строк меньше чем 18');
If Length(S[17]) < 22 Then Raise Exception.Create('В строке 18 меньше чем 22 символа');
A := S[17]; // Нумерация строк идет с 0
A[21] := C1;
A[22] := C2;
S[17] := A;
S.SaveToFile(AFileName);
Finally
S.Free;
End;
end;
Измененые и добавленые строки выделены жирным.