Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-06-2015
Anel Hernandez Anel Hernandez is offline
Miembro
 
Registrado: mar 2005
Posts: 94
Poder: 20
Anel Hernandez Va por buen camino
Copiar parte de un TStringList a otro

hola,

necesito adicionar un grupo de lineas de un TStringList al final de otro.

es decir, suponiendo que ambos TStringList tienen 100 lineas, quisiera añadir las
lineas de la 60 a la 100 del primero al final del segundo.

lo he hecho linea a linea pero quisiera saber como hacerlo mas rapido con alguna
funcion estilo Add etc.

lo he intentado con AddStrings() pero no lo consigo.

hay alguna forma de decirle un numero de lineas especificas?

pudieran ayudarme?
gracias
A
Responder Con Cita
  #2  
Antiguo 30-06-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Anel Hernandez,

Cita:
Empezado por Anel Hernandez
...copiar parte de un TStringList a otro...quisiera saber como hacerlo mas rápido...


Pregunto:

1- ¿Tienes un problema concreto con los tiempos de copia?

2- ¿Que versión de Delphi y Windows utiliza tu aplicación?.

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
   SL1, SL2 : TStringList;
   i : Integer;
   Frecuencia, ITime, FTime : Int64;
   MSeconds : Int64;

begin

   QueryPerformanceFrequency(Frecuencia);
   QueryPerformanceCounter(ITime);

   SL1 := TStringList.Create;
   SL2 := TStringList.Create;

   SL1.BeginUpdate;
   for i := 1 to 1000 do
      SL1.Add('SL1 Dato-' + IntToStr(i));
   SL1.EndUpdate;

   SL2.BeginUpdate;
   for i := 1 to 1000 do
      SL2.Add('SL2 Dato-' + IntToStr(i));

   for i := 59 to SL1.Count - 1 do
      SL2.Add(SL1.Strings[i]);
   SL2.EndUpdate;

   QueryPerformanceCounter(FTime);

   MSeconds := (FTime-ITime) * 1000000 div Frecuencia;

   MessageDlg(Format('Total tiempo de copia de TStringList : %u Millonésimas de Segundo',[MSeconds]),mtInformation,[mbOK],0);

   SL1.Free;
   SL2.Free;

end;

end.
El código anterior en Delphi 7 sobre Windows 7 Professional x32, Copia parte de un TStringList a otro utilizando los métodos BeginUpdate y EndUpdate para mejorar el performance de la copia, como se puede ver en la siguiente imagen:



Nota:

1- En el tiempo se incluyo la creación y carga de datos de los TStringList para tener un marco referencial de todo el proceso.

2- La muestra de proceso fueron 1000 Strings por cada TStringList.

3- Se copio el 94,10% de los Items de un TStringList a otro (Del 60 al 1000).

4- Los métodos BeginUpdate y EndUpdate mejoraron muy marginalmente el procesamiento de los TStringList, el proceso de por si es muy rápido por lo cual la mejora es apenas evidente.

Espero sea útil

Nelson.
Responder Con Cita
  #3  
Antiguo 30-06-2015
Anel Hernandez Anel Hernandez is offline
Miembro
 
Registrado: mar 2005
Posts: 94
Poder: 20
Anel Hernandez Va por buen camino
gracias Nelson,

si tengo problemas con los tiempos. Trabajo con ficheros meteorologicos de varios gigas y decenas de miles de lineas. Son ficheros texto de varios megas. Pueden llegar a 700MB.

voy a intentar tu ejemplo.

muchas gracias
Responder Con Cita
  #4  
Antiguo 30-06-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Anel Hernandez,

Cita:
Empezado por Anel Hernandez
...tengo problemas con los tiempos...Trabajo con ficheros meteorológicos de varios gigas y decenas de miles de líneas...Son ficheros texto...


Pregunto: ¿Puedes publicar una muestra del fichero meteorológico en cuestión para hacer pruebas?.

Espero sea útil

Nelson.
Responder Con Cita
  #5  
Antiguo 30-06-2015
Anel Hernandez Anel Hernandez is offline
Miembro
 
Registrado: mar 2005
Posts: 94
Poder: 20
Anel Hernandez Va por buen camino
hola,

de que tamaño desean el fichero? cuantas lineas?

gracias
Anel
Responder Con Cita
  #6  
Antiguo 30-06-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Anel Hernandez,

Cita:
Empezado por Anel Hernandez
...¿De que tamaño desean el fichero?, ¿Cuantas líneas?...


Te comento:

1- En principio sería suficiente un archivo con las primeras 100 líneas, la idea es poder crear uno con una estructura similar a efectos de prueba.

2- ¿Cual es el mayor y menor tamaño registrado para un archivo meteorológico?, ¿Cual es el tamaño promedio?.

3- Si como se indica en el Msg #3 trabajas con archivos de texto con tamaños en el orden de los GB y decenas de miles de registros, es conveniente analizar formas alternas de manejo de la data, por ejemplo por medio de una BD, ¿Podrías explicar un poco el proceso de generación, carga y procesamiento de la información meteorológica en cuestión?.

En resumen : No es conveniente manejar tal cantidad de datos en memoria, el problema no son los TStringList es el volumen de la data.

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 01-07-2015 a las 08:43:26.
Responder Con Cita
  #7  
Antiguo 01-07-2015
Anel Hernandez Anel Hernandez is offline
Miembro
 
Registrado: mar 2005
Posts: 94
Poder: 20
Anel Hernandez Va por buen camino
hola,

normalmente los modelos de pronostico meteorologicos trabajan con ficheros .nc (netcdf). estos pueden llegar a tener varios GB.

hay otros modelos que se alimentan de estos ficheros, modelos de diagnostico meteorologicos, de dispersion atmosferica, fotoquimicos, etc.

algunos de ellos tienen herramientas para transformar los ficheros .nc en binarios o de texto. yo estoy trabajando con uno que los usa de texto.

son modelos establecidos hace decadas y lo que hago es aplicarlos. no tendria mucho sentido transformar en BBDD. la alternativa que he elegido es intentar optimizar los procesos de conversion etc.

ahora un ejemplo simple:
en mi caso tengo 66 ficheros de 1.46MB con 31882 lineas cada uno. Debo entonces copiar de los ficheros del 2 al 66, desde la linea 1257 de cada uno hasta la ultima (la 31882) y añadirselos al final del 1ro.

Al final tendria un fichero de 101MB y 2 022 507 lineas. ese es un ejemplo simple. pueden ser mas grandes.
Adjunto un fichero editado de ejemplo donde suprimo algunas lineas.

He intentado con el metodo del BeginUpdate y gana pocos segundos. adjunto imagenes.

En mi caso leo con:

Código Delphi [-]
SL1.LoadFromFile(fichero1);
For I:=2 to 66 do
 SL2.LoadFromFile(fichero[i]);
end;

y salvo al final en el mismo fichero1

Código Delphi [-]
SL1.SaveToFile(fichero1);

Gracias
Anel
Imágenes Adjuntas
Tipo de Archivo: jpg z_con.jpg (26,2 KB, 9 visitas)
Tipo de Archivo: jpg Copia z_sin.jpg (35,4 KB, 4 visitas)
Archivos Adjuntos
Tipo de Archivo: rar WRF01.rar (3,9 KB, 5 visitas)
Responder Con Cita
  #8  
Antiguo 01-07-2015
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
Hola Anel Hernandez

Adicionalmente al uso de BeginUpdate-EndUpdate, también es recomendable fijar la propiedad Sorted a False.

Por otra parte, cuando agregas elementos a una lista dentro de un ciclo, la lista tendrá que ajustar dinámicamente el tamaño de la memoria reservada conforme se requiera. Sin darnos cuenta, esta operación puede repetirse un número considerable de veces y eso afectará el rendimiento.

Por este motivo, es muy aconsejable que puedas determinar con anticipación el número de elementos que vas a añadir y esto se puede indicar en la propiedad Capacity.

De esta forma reservamos la memoria en una sola operación antes de entrar al ciclo.

Código Delphi [-]
var
  ItemsToAdd: Integer;
  I: Integer;
begin
   ItemsToAdd:=100000; 
   .
   .
   .
   SL.Sorted:=False;
   SL.Capacity := SL.Count + ItemsToAdd;
   for I := 1 to ItemsToAdd do
    SL.Add('Algo');

Saludos
Responder Con Cita
  #9  
Antiguo 01-07-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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 Anel Hernandez.

Tomando en cuenta del formato del archivo que enviaste, proba de este modo:
Código Delphi [-]
procedure AddLinesToFile(const pFrom, pTo: Integer; const fSource, fTarget: string);
const
  CRLF = #$D#$A;
var
  fs: TStream;
  ts: TStrings;
  s : string;
  i : Integer;
begin
  fs := TFileStream.Create(fTarget, fmOpenReadWrite);
  try
    SetString(s, nil, fs.Size);
    fs.Read(s[1], fs.Size);
    s := s + CRLF;
    ts := TstringList.Create;
    try
      ts.BeginUpdate;
      try
        ts.LoadFromFile(fSource);
      finally
        ts.EndUpdate;
      end;
      for i:= pFrom to pTo do s := s + ts[i] + CRLF;
    finally
      ts.Free;
    end;
  finally
    fs.Position:= 0;
    fs.Write(s[1], Length(s));
    fs.Free;
  end;
end;

Código de prueba:
Código Delphi [-]
procedure TForm1.btnAddClick(Sender: TObject);
const
  MILLION = 1000000;
var
  Hz, Start, Stop: Int64;
begin
  QueryPerformanceFrequency(Hz);
  QueryPerformanceCounter(Start);

  // Añade las líneas 1257-3188 desde WRF02.DAT hacia WRF01.DAT
  AddLinesToFile(1257, 31882, 'c:\tmp\WRF02.DAT', 'c:\tmp\WRF01.DAT');

  QueryPerformanceCounter(Stop);
  ShowMessage(Format('%d µs.',[(Stop-Start) * MILLION div Hz]));
end;
Creo que demora un tiempo muy aceptable,



Saludos

Edito: Lo olvidaba ... - Tamaño de WRF01.DAT: 1,55 MB y WRF02.DAT: 12,3 MB
__________________
Daniel Didriksen

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

Última edición por ecfisa fecha: 01-07-2015 a las 20:01:13.
Responder Con Cita
  #10  
Antiguo 01-07-2015
Anel Hernandez Anel Hernandez is offline
Miembro
 
Registrado: mar 2005
Posts: 94
Poder: 20
Anel Hernandez Va por buen camino
hola ecfisa,

el ejemplo de tiempo que pones es para 2 ficheros? yo tengo que adicionar 65!!!!

de todas maneras pruebo.

gracias
A
Responder Con Cita
  #11  
Antiguo 01-07-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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 Anel Hernandez.

El penúltimo parámetro del procedimiento recibe el nombre del archivo del cuál se extraerán las líneas a ser agregadas. Basta con que envíes los nombres de los archivos a ser tratados de forma secuencial en él (65 o los que gustes).

Las líneas extraídas de los N archivos serán añadidas al archivo correspondiente al parámetro fTarget.

Saludos
__________________
Daniel Didriksen

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

Última edición por ecfisa fecha: 01-07-2015 a las 21:01:36.
Responder Con Cita
  #12  
Antiguo 01-07-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Esto me recuerda a:
Cita:
Empezado por Ley de Brooks
"Una señora es capaz de tener un hijo en nueve meses, pero este plazo no puede disminuir por muchas mujeres embarazadas que pongamos a ello"
Responder Con Cita
  #13  
Antiguo 01-07-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Esto me recuerda a:
Cita:
"Una señora es capaz de tener un hijo en nueve meses, pero este plazo no puede disminuir por muchas mujeres embarazadas que pongamos a ello"
La simpleza de una gran verdad

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #14  
Antiguo 30-10-2015
Anel Hernandez Anel Hernandez is offline
Miembro
 
Registrado: mar 2005
Posts: 94
Poder: 20
Anel Hernandez Va por buen camino
Hola,

esta ultima variante calcula un poco mas lento. pocos milisegundos de diferencia.

ahora el problema esta cuando utilizo ficheros mas grandes. estoy trabajando con 4 ficieros de 228MB cada uno. Con 4 355 891 lineas cada uno.

y me da error "out of memory" en la linea:
Código Delphi [-]
for i:= pFrom to pTo do s := s + ts[i] + CRLF;


solo concatena los 3 primeros ficheros. en el 4 explota.

la pregunta: el problema es de RAM o de Delphi?

alguna alternativa para concatenar archivos tan grandes?

gracias
A
Responder Con Cita
  #15  
Antiguo 30-10-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
si estas usando el codigo de daniel, la variable s es un string, los string (que es un alias de UnicodeString) en delphi si mal no recuerdo crecen hasta 2 gb, no sera ahi el problema?

archivos de 200mb no son muy grandes, yo hago la lectura usando el "old pascal i/o" y anda fenomenal, de hecho retroalimento la ui lo cual hace mas lento el procesamiento del archivo pero queda mas lindo

Es mas hasta incluso cometo la "estupides" de contar la cantidad de lineas para poder mostrar algo como "procesado x/CantLineas % completado"

Código Delphi [-]
// variables de instancia de la clase que procesa el archivo
strict private
    FCount: Integer;
    FTextFile: TextFile;
    FFilePath: string;

...
  AssignFile(FTextFile, FFilePath);

  try
    Reset(FTextFile);
    CountLines;
    { este seria el proceso contar lineas 
    procedure CountLines;
    begin
      FCount := 0;
      while not Eof(FTextFile) do
      begin
        Readln(FTextFile);
        Inc(FCount);
      end;
    end; }
    Reset(FTextFile);
    LCurrent := 0;

    Readln(FTextFile, LString);
    Inc(LCurrent);
    // procesar linea 
  finally
    CloseFile(FTextFile);
  end;

El archivo en cuestion tiene casi 200mb y unas 3,3 millones de lineas
El proceso de arriba en cuestion, incluyendo el conteo de lineas, el procesamiento interno, el guardado en la BD y teniendo en cuenta que retroalimenta la gui me demora unos 2, 3 min

Última edición por AgustinOrtu fecha: 30-10-2015 a las 07:27:16.
Responder Con Cita
  #16  
Antiguo 30-10-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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 Anel Hernandez

Como te menciona Agustín cuando los archivos son muy grandes es mas adecuado usar los procedimientos estandar de entrada/salida.
El método LoadFromFile de la clase TStrings, carga la totalidad del archivo en la memoria y luego lo divide en líneas, haciendo que se duplique el consumo de memoria y a veces puede provocar fragmentaciónes en la misma.

A cada variable de archivo de texto, Delphi le asigna un almacenamiento interno (buffer) de 128 bytes, por lo que usar el procedimiento SetTextBuff para modificar este valor, va a acelerar un poco el proceso.

Reproduje la situación con cuatro archivos de 228 Mb en este ejemplo:
Código Delphi [-]
...

procedure AppendTextFiles(const TargetName: TFileName;
  const SourceNames: array of TFileName);
var
  i      : Integer;
  source,
  target : TextFile;
  buffer : array[1..4096] of Char; 
  row    : string;
begin
  AssignFile(target, TargetName);
  // (*)
  try
    Reset(target);
  except
    ReWrite(target);
  end;
  // 
  Append(target);
  System.SetTextBuf(target, buffer);

  for i := Low(SourceNames) to High(SourceNames) do
  begin
    AssignFile(source, SourceNames[i]);
    Reset(source);
    System.SetTextBuf(source, buffer);
    while not Eof(source) do
    begin
      Readln(source, row);
      Writeln(target, row);
    end;
    Close(source);
  end;

  CloseFile(target);
end;


procedure TForm1.btnWritelnClick(Sender: TObject);
const
  MILLON = 1000000;
var
  Hz, Start, Stop: Int64;
begin
  QueryPerformanceFrequency(Hz);
  QueryPerformanceCounter(Start);

  AppendTextFiles('total.txt',['p1.txt', 'p2.txt', 'p3.txt', 'p4.txt']);
  QueryPerformanceCounter(Stop);

  ShowMessage(Format('%d µs.',[(Stop-Start) * MILLON div Hz]));
end;
Con un resultado en mi equipo de 76558319 µs ~ 76,55 s, tiempo mas que razonable.



(*): Si deseas que siempre se sobreescriba el archivo destino, reemplaza las lineas entre comentarios por:
Código Delphi [-]
ReWrite(target);

Saludos
__________________
Daniel Didriksen

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

Última edición por ecfisa fecha: 30-10-2015 a las 23:18:43. Razón: sintáxis
Responder Con Cita
  #17  
Antiguo 31-10-2015
Anel Hernandez Anel Hernandez is offline
Miembro
 
Registrado: mar 2005
Posts: 94
Poder: 20
Anel Hernandez Va por buen camino
hola,
estoy corriendo el ejemplo tal cual con 2 ficheros pequeños y con los nombres propuestos y da problemas.

no adiciona lineas, sobreescribe a partir de determinadas lineas adicionada comienza a reescribir lineas anteriores.

adjunto ficheros de ejemplo (p1.txt, p2.txt, total.txt).

sustitui el while por un ciclo de 77 lineas adicionadas y da bien (total77.txt). luego cuando lo intento con 78 da error (total78.txt). llegue a estos numeros por tanteo.

cual es el error?

gracias
A
Archivos Adjuntos
Tipo de Archivo: rar delp.rar (29,6 KB, 2 visitas)
Responder Con Cita
  #18  
Antiguo 01-11-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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 Anel.

En este ejemplo quité todos los ornamentos, genera los 4 archivos de texto, los concatena en otro y muestra el archivo en un memo:
Código Delphi [-]
// Genera los cuatro archivos de texto de ejemplo
procedure TForm1.FormCreate(Sender: TObject);
var
  i, j: Integer;
  f: TextFile;
  s: string;
begin
  for i:= 1 to 4 do
  begin
    AssignFile(f, Format('p%d.txt', [i]));
    ReWrite(f);
    s := StringOfChar(Chr(96+i), 40);  // a, b, c, d
    for j := 1 to 5 do Writeln(f, s);
    CloseFile(f);
  end;
end;

// Concatenar sobreescribiendo
procedure AppendTextFiles(const TargetName: TFileName;
  const SourceNames: array of TFileName);
var
  i      : Integer;
  source,
  target : TextFile;
  row    : string;
begin
  AssignFile(target, TargetName);
  Rewrite(target);
  Append(target);
  for i := Low(SourceNames) to High(SourceNames) do
  begin
    AssignFile(source, SourceNames[i]);
    Reset(source);
    while not Eof(source) do
    begin
      Readln(source, row);
      Writeln(target, row);
    end;
    Close(source);
  end;
  CloseFile(target);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   AppendTextFiles('total.txt', ['p1.txt', 'p2.txt', 'p3.txt', 'p4.txt']);
   Memo1.Lines.LoadFromFile('total.txt');
end;

Salida del ejemplo:
;
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #19  
Antiguo 01-11-2015
Anel Hernandez Anel Hernandez is offline
Miembro
 
Registrado: mar 2005
Posts: 94
Poder: 20
Anel Hernandez Va por buen camino
hola,

el ejemplo funciona perfectamente. El anterior logre que funcionara comentando la linea:
Código Delphi [-]
System.SetTextBuf(source, buffer);

luego cambie las variables buffer y quedo como:
Código Delphi [-]
System.SetTextBuf(target, buffer1);
...
System.SetTextBuf(source, buffer2);

ya todo OK. 23 segundos y todo OK.

gracias
A
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Borrar una parte de un TStringList eennzzoo C++ Builder 2 28-06-2014 15:04:13
copiar el contenido de un TStringList a TSringGrid GerTorresM Varios 1 02-07-2010 19:38:41
copiar la parte seleccionada de un imagen fasthorse C++ Builder 4 14-05-2008 21:05:03
Copiar parte de la pantalla.... craven Gráficos 2 27-08-2003 23:53:01
Copiar Parte de un BMP a otro craven API de Windows 1 07-07-2003 11:45:34


La franja horaria es GMT +2. Ahora son las 01:30:15.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi