Con un String no se puede realizar tan rápido la cosa.
Un integer ocupa 2 bytes en memoria, exactamente lo mismo que un puntero a un objeto, de ahí que se pueda guardar el integer sin problema alguno.
Un string, es un puntero a memoria donde se guardará la cadena. Como no estas reservando memoria, estas escribiendo en una zona de memoria que no te pertenece. Que algunas veces recuperes parte de la cadena... es solo suerte, deberías recibir un Access Violation al asignar o recuperar la cadena de texto.
Soluciones hay muchas, pero creo que la más cómoda, es crearte tu propio objeto:
Código Delphi
[-]
TCliente = Class(TObject);
public
Nombre:string
Facturado:Currency
end;
var C:TCliente;
while not Table1.Eof do
begin
C := TCliente.Create;
C.Nombre := Table1campo2.AsString;
C.Facturado := Table1campo1.Value;
ComboBox1.Items.AddObject(Table1Campo1.Value , C);
Table1.Next;
end;
edit1.text := TCliente(ComboBox1.Items.Objects[ComboBox1.ItemIndex]).Nombre;
For I:= combo.items.count-1 downto 0 do
TCliente(Combo.items.objects[i]).Free;
He añadido el campo "Facturado" como mero ejemplo de que puedes guardar más cosas en el objeto.
Saludos.