Ver Mensaje Individual
  #3  
Antiguo 08-02-2018
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Reputación: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
El método 2 no libera al primer St Creado.
Al método 1 le agregué el TRY..FINALLY por si falla algo entre que se crea y se libera.
Código Delphi [-]
Function TForm1.DelimitarString(Cadena: String; Delimitador: Char): TStringList;
begin
  Result := TStringList.Create;
  Result.Delimiter := Delimitador;
  Result.StrictDelimiter := True;
  Result.DelimitedText := Cadena;
end;

// Método 1
Procedure TForm1.TratarCadena1;
Var
  St: TStringList;
begin
  St := DelimitarString('Uno;Dos;Tres', ';');
  // Si llega aquí, St se ha creado correctamente. 
  // Agrego Try..Finally para asegurarme de que se libere, pase lo que pase.
  try
     Showmessage(St[0] + #13 + St[1] + #13 + St[2]);
  finally
     St.Free;
  end;
end;

// Método 2
Procedure TForm1.TratarCadena2;
Var
  St: TStringList;
begin
  St := TStringList.Create;
  Try
    // Esto machaca el St creado con otro que creará dentro de la función DelimitarString 
    St := DelimitarString('Uno;Dos;Tres', ';');
    Showmessage(St[0] + #13 + St[1] + #13 + St[2]);
  Finally
    St.Free;
  end;
end;

De todos modos, a mi me gusta mas crear los objetos y pasárselo a los procedimientos para que los rellenen.
Por ejemplo le puedes pasar la lista de items de un componente TCombo... para que te lo rellene.
Código Delphi [-]
procedure RellenaAlmacenes(Lista: TStrings);
var
  Idalmacen : integer;
begin
  Lista.Clear;
  Lista.AddObject(_('Todos los Almacenes'), Pointer(0));

  // Abro y fitro tabla de almacenes activos
  ...
  while not TablaAlmacenes.EOF do
  begin
     Idalmacen := FieldByName('ID').AsInteger;
     Almacen := FieldByName('ALMACEN').AsString + ' ' + FieldByName('DESCRIPCION').AsString;
     Lista.AddObject(Almacen, Pointer(IdAlmacen));
     Next;
  end;
end;

begin
  ...
  RellenaAlmacenes(CBAlmacen.Items);
  CBAlmacen.ItemIndex := 0;
  ...
end;

Según tu ejemplo sería algo asi:
Código Delphi [-]
procedure TForm1.DelimitarString(St: TStringList; Cadena: String; Delimitador: Char);
begin
  St.Delimiter := Delimitador;
  St.StrictDelimiter := True;
  St.DelimitedText := Cadena;
end;

Procedure TForm1.TratarCadena1;
Var
  St: TStringList;
begin
  St := TStringList.Create;
  // Si llega aquí, St se ha creado correctamente. 
  // Agrego Try..Finally para asegurarme de que se libere, pase lo que pase.
  try
     DelimitarString(St, 'Uno;Dos;Tres', ';');
     Showmessage(St[0] + #13 + St[1] + #13 + St[2]);
  finally
     St.Free;
  end;
end;
Responder Con Cita