Ver Mensaje Individual
  #4  
Antiguo 17-07-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Santiago.

Cita:
Empezado por santiago14 Ver Mensaje
...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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 17-07-2014 a las 05:38:59.
Responder Con Cita