Problema in via di risoluzione, finalmente... ^^

Grazie dell'aiuto, l'idea di cercare le coordinate così era buona, infatti sembra funzionare. Da qui dovrei riuscire da solo. Intanto pubblico il codice, nel caso (improbabile ^^) che a qualcuno interessasse :P

function TSheet.solve(c, r: integer): string;
var exp,sc:string;
i,p1,p2:integer;
begin
exp:=(HideGrid[c,r]);
if cells[c,r].formula then
begin
if cells[c,r].formula then delete(exp,1,1);
while letter(exp) do
for i:= 1 to (length(exp)-1) do
if isletter(exp[i]) then
begin
sc:='';
sc:=exp[i];
if isnumber(exp[i+1]) then
begin
sc:= sc + exp[i+1];
if ((i+2)<=length(exp)) then
if isnumber(exp[i+2]) then sc:= sc + exp[i+2];
if ((i+3)<=length(exp)) then
if isnumber(exp[i+3]) then sc:= sc + exp[i+3];
exp:=replace(exp, sc, solve(tradcol(sc), tradrow(sc), c, r));
end
else
if UpCase(exp[i]) = UpCase(parameter) then
begin
exp:=replace(exp, parameter, solve(Visualgrid.Col,visualgrid.Row,c,r));
end;
end;
exparser1.Expression.Clear;
exparser1.Expression.add(exp);
result:=exparser1.F([]);
end
else
begin
if cells[c,r].empty then result:='0';
if cells[c,r].data then result:=visualgrid.Cells[c,r];
end;
end;
Parameter è un char che si può usare per calcolare velocemente formule. Del tipo, in una cella c'è scritto '=k^2', e ogni volta che ci si sposta di cella in cella, il valore viene ricalcolato con il contenuto della cella.
Cells[c,r] è un array di record che contiene tre boolean, per controllare se contiene formule, dati, o niente.
Letter(s) è una funzione che da vero se la stringa contiene almeno una lettera. IsLetter fa la stessa cosa su un char. IsNumber direi che si spiega da solo.
Replace sostituisce all'interno di una stringa una sottostringa con una nuova.
TradCol e TradRow trasformano la stringa delle coordinate in coordinate numeriche per risolvere la nuova cella.
Replace è l'unica mediamente interessante, quindi posto anche quella.

function TSheet.replace(s, old, new: string): string;
var p1,p2:integer;
sx,s1,s2:string;
begin
sx:=s;
if pos(old, sx) > 0 then
begin
p1:=pos(old, sx);
p2:=p1 + length(old);
s1:=copy(sx, 1, p1-1);
s2:=copy(sx, p2, length(sx)-(p2-1));
result:= s1 + new + s2;
end
else
result:=sx;
end;
Chissà che non servano a qualcuno (ne dubito xD) ^^