Hola Santiago.
Cita:
Empezado por santiago14
...En p2 devuelve basura. ¿Qué estoy haciendo mal?
|
Lo que sucede es que estas asignando a todos los apuntadores la misma dirección de memoria (variable "tipo") y cambiando su contenido antes de cada nueva asignación, cuando lo que necesitas es que los apuntadores hagan lo suyo a distintas posiciones de memoria (variables).
Tenes varias maneras de lograr lo que buscas:
Usando un
TStrings y un arreglo, como en el ejemplo que te puso Nelson.
Código Delphi
[-]
var
TipServ: TStrings;
StrVec: array of string;
procedure TForm1.FormCreate(Sender: TObject);
begin
TipServ:= TStringList.Create;
with qryTiposServicios do
begin
Open;
while not eof do
begin
SetLength(StrVec, Length(StrVec) + 1);
StrVec[High(StrVec)]:= FieldByName('CAPITAL').AsString;
TipServ.AddObject(FieldByName('NAME').AsString, Pointer(StrVec[High(StrVec)]));
Next;
end;
end;
end;
procedure TForm1.btnShowClick(Sender: TObject);
var
i: Integer;
begin
Memo1.Clear;
for i:= 0 to TipServ.Count-1 do
Memo1.Lines.Add(Format('%s, %s',[TipServ[i],
string(TipServ.Objects[i])]));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
TipServ.Free;
Finalize(StrVec);
end;
Usando una clase:
Código Delphi
[-]
type
TMiStr = class
s1: string;
end;
var
TipServ: TStrings;
procedure TForm1.FormCreate(Sender: TObject);
var
MiStr: TMiStr;
begin
TipServ:= TStringList.Create;
with qryTiposServicios do
begin
Open;
while not eof do
begin
MiStr:= TMiStr.Create;
MiStr.s1:= FieldByName('DESCRIPCION').AsString;
TipServ.AddObject(FieldByName('TIPO').AsString, TObject(MiStr));
Next;
end;
end;
end;
procedure TForm1.btnShowClick(Sender: TObject);
var
i: Integer;
begin
Memo1.Clear;
for i:= 0 to TipServ.Count-1 do
Memo1.Lines.Add(Format('%s, %s',[TipServ[i], TMiStr(TipServ.Objects[i]).s1]));
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
i: Integer;
begin
for i:= 0 to Pred(TipServ.Count) do
TipServ.Objects[i].Free;
TipServ.Free;
end;
Con dos
TStrings.
Código Delphi
[-]
...
var
s1: TStrings;
s2: TStrings;
procedure TForm1.FormCreate(Sender: TObject);
begin
s1:= TStringList.Create;
s2:= TStringList.Create;
with qryTiposServicios do
begin
Open;
while not eof do
begin
s1.Add(FieldByName('TIPO').AsString);
s2.Add(FieldByName('DESCRIPCION').AsString);
Next;
end;
end;
end;
procedure TForm1.btnShowClick(Sender: TObject);
var
i: Integer;
begin
Memo1.Clear;
for i:= 0 to s1.Count-1 do
Memo1.Lines.Add(Format('%s, %s',[s1[i],s2[i]]));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
s1.Free;
s2.Free;
end;
Mediante un array dinámico.
Código Delphi
[-]
...
type
TRecStr = record
s1: string;
s2: string;
end;
var
VecStr: array of TRecStr;
procedure TForm1.FormCreate(Sender: TObject);
begin
with qryTiposServicios do
begin
Open;
while not eof do
begin
SetLength(VecStr, Length(VecStr)+1);
VecStr[High(VecStr)].s1:= FieldByName('TIPO').AsString;
VecStr[High(VecStr)].s2:= FieldByName('DESCRIPCION').AsString;
Next;
end;
end;
end;
procedure TForm1.btnShowClick(Sender: TObject);
var
i: Integer;
begin
Memo1.Clear;
for i:= Low(VecStr) to High(VecStr) do
Memo1.Lines.Add(Format('%s, %s',[VecStr[i].s1, VecStr[i].s2]));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Finalize(VecStr);
end;
Particularmente considero los dós últimos códigos mas naturales, sin necesidad de forzar tipos através del uso de moldeos.
Saludos