Во первых, тебе надо иметь константный массив соответсвия символов значениям. Во вторых, надо писать парсер, который разбирает выражение и с помощью соотв. массива возвращает тебе твои циферки.
Ты не написал что надо делать с этими цифрами (куда их "складывать").
Для твоего примера будет где-то так:
Код:
type
TVal = record
Letter : String;
Value : Integer;
end;
const
Vals : Array [1..3] Of TVal =
((Letter:'H'; Value:3),(Letter:'S'; Value:7),(Letter:'O'; Value:1));
function GetValue(ALetter : String) : Integer;
var
I : Integer;
begin
Result := -1;
For I := 1 To 3 Do
If Vals[i].Letter = ALetter Then
Begin
Result := Vals[i].Value;
Break;
End;
end;
function Parse(AText : String) : String;
var
I : Integer;
Buf : String;
V : Integer;
begin
Result := '';
I := 1;
While I <= Length(AText) Do
Begin
// Получить хим элемент.
If Not (AText[i] In ['A'..'Z']) Then Raise Exception.CreateFmt('Ошибка в формуле в позиции %d',[i]);
Buf := AText[i];
If AText[I+1] In ['a'..'z'] Then
Begin
Inc(I);
Buf := Buf + AText[i];
End;
V := GetValue(Buf);
If V = -1 Then Raise Exception.CreateFmt('Введенный хим элемент не найден (%s)',[Buf]);
Result := Result + IntToStr(V);
Inc(I);
// Проверяем на цифру
Buf := '';
While AText[i] In ['0'..'9'] Do
Begin
Buf := Buf + AText[i];
Inc(I);
End;
If Buf <> '' Then Result := Result + '*' + Buf;
Result := Result + ' - ';
End;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text := Parse(Edit1.Text);
end;
Код понимает "правильное" написание химэлементов (первая буква большая, вторая, если есть, маленькая) и цифры. Цифра не может идти первой. Результат выводит в виде строки. Для увеличения поддерживаемых элементов надо "добить" их в константный массив в соотв. виде и скорректировать цикл в функции GetValue.