Ir al contenido


Cargar un StringGrid con un file Intelhex.


  • Por favor identifícate para responder
24 respuestas en este tema

#1 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 03 noviembre 2008 - 05:04

Hola amigos.
Necesito un poco de ayuda con este codigo:


delphi
  1. procedure TForm1.OpenFileClick(Sender: TObject);
  2. var
  3.    i,j,indice: integer;
  4. Str: String;
  5. begin
  6. if OpenDialog1.Execute then
  7. Edit1.Text:=OpenDialog1.FileName;
  8.    Memo1.Clear;
  9.    //Inicializo las columnas y filas de el stringgrid donde se inicia la escritura
  10.      with TStringList.Create do
  11.     try
  12.      if FileExists(Edit1.Text) then
  13.      begin
  14.      LoadFromFile(Edit1.Text);
  15. FillChar(Buffer,Sizeof(Buffer),#255);
  16. for i:= 0 to Count - 1 do
  17. Insertar(Strings[i],Buffer);
  18. j:= StrToInt(Bufsize.caption);
  19. Str:= EmptyStr;
  20. end;
  21.   begin
  22.   indice := 0; //Suponiendo que buffer sea un array de 1...x
  23.   for i := 1 to 255 do begin  //2 renglones, cambialo a los renglones que esperas
  24.      for j := 1 to 16 do begin //15 columnas
  25.          stringgrid1.Cells[j,i] := inttohex(Buffer[indice],2);
  26.          inc(indice);
  27.      end;
  28.   end;
  29. end;
  30.   Str:= Str + #32 + IntToHex(Buffer[i],2);
  31.             if ((i+1) mod 16 = 0) then
  32.               begin
  33.                 Memo1.Lines.Add(Str);
  34.                 Str:= EmptyStr;
  35.               end;
  36.  
  37.  
  38.       if Str <> EmptyStr then
  39.         Memo1.Lines.Add(Str);
  40.  
  41.     finally
  42.       Free;
  43.     end;
  44. end;



Yo tengo este codigo trabajando, pero quiero poder llenar las casillas del stringgrid sin tener que usar el Memo1.
Aqui esta la otra parte de este codigo:


delphi
  1. function Insertar(Str: String; var Buffer: TBuffer): String;
  2. var
  3.   i,j,k: Integer;
  4. begin
  5.   Result:= EmptyStr;
  6.   Str:= Trim(Str);
  7.   if Copy(Str,1,1) = ':' then
  8.     if TryStrToInt('$' + Copy(Str,2,2),i) then
  9.       if Length(Str) = ((2*i) + 11) then
  10.         if TryStrToInt('$' + Copy(Str,4,4),j) then
  11.           if TryStrToInt('$' + Copy(Str,8,2),k) then
  12.             if k = 0 then
  13.               begin
  14.                 Str:= Copy(Str,10,2*i);
  15.                 for k:= j to (j + i - 1) do
  16.                   begin
  17.                     Buffer[k]:= StrToInt('$' + Copy(Str,1,2));
  18.                     Delete(Str,1,2);
  19.                   end;
  20.               end;
  21. end;



¿Alguna idea de como lograr esto?

Un Saludo.

#2 eduarcol

eduarcol

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.483 mensajes
  • LocationVenezuela

Escrito 03 noviembre 2008 - 05:07

no se si entendi mal el codigo pero el memo1 no lo necesitas para llenar el grid
  • 0

#3 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 03 noviembre 2008 - 05:11

no se si entendi mal el codigo pero el memo1 no lo necesitas para llenar el grid


Hola eduarcol.
¿Entonces podria eliminar esta parte del codigo sin problema?



delphi
  1. Str:= Str + #32 + IntToHex(Buffer[i],2);
  2.             if ((i+1) mod 16 = 0) then
  3.               begin
  4.                 Memo1.Lines.Add(Str);
  5.                 Str:= EmptyStr;
  6.               end;
  7.  
  8.  
  9.       if Str <> EmptyStr then
  10.         Memo1.Lines.Add(Str);
  11.  
  12.     finally
  13.       Free;
  14.     end;
  15. end;



Un Saludo.

#4 eduarcol

eduarcol

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.483 mensajes
  • LocationVenezuela

Escrito 03 noviembre 2008 - 05:13

Hola eduarcol.
¿Entonces podria eliminar esta parte del codigo sin problema?


delphi
  1. Str:= Str + #32 + IntToHex(Buffer[i],2);
  2.             if ((i+1) mod 16 = 0) then
  3.               begin
  4.                 Memo1.Lines.Add(Str);
  5.                 Str:= EmptyStr;
  6.               end;
  7.  
  8.  
  9.       if Str <> EmptyStr then
  10.         Memo1.Lines.Add(Str);
  11.  
  12.     finally
  13.       Free;
  14.     end;
  15. end;



Un Saludo.


yo no le veo problema, pero comentalo a ver como funciona...



delphi
  1. Str:= Str + #32 + IntToHex(Buffer[i],2);
  2.          (*   if ((i+1) mod 16 = 0) then
  3.               begin
  4.                 Memo1.Lines.Add(Str);
  5.                 Str:= EmptyStr;
  6.               end;
  7.  
  8.  
  9.       if Str <> EmptyStr then
  10.         Memo1.Lines.Add(Str);*)
  11.  
  12.     finally
  13.       Free;
  14.     end;
  15. end;



fijate que ni el finally ni la primera linea las comente
  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.259 mensajes
  • LocationMéxico

Escrito 03 noviembre 2008 - 05:14

Pues si, eso esta de mas, solo que me parece que hay algo raro en tu código



delphi
  1. procedure TForm1.OpenFileClick(Sender: TObject);
  2. var
  3.   i,j,indice: integer;
  4.   Str: String;
  5. begin
  6.   if OpenDialog1.Execute then
  7.      Edit1.Text:=OpenDialog1.FileName;
  8.      Memo1.Clear;
  9.      //Inicializo las columnas y filas de el stringgrid donde se inicia la escritura
  10.      with TStringList.Create do
  11.      try
  12.        if FileExists(Edit1.Text) then begin
  13.           LoadFromFile(Edit1.Text);
  14.           FillChar(Buffer,Sizeof(Buffer),#255);
  15.           for i:= 0 to Count - 1 do
  16.               Insertar(Strings[i],Buffer);
  17.           j:= StrToInt(Bufsize.caption);
  18.           Str:= EmptyStr;
  19.        end;
  20. //*****************************************************
  21.        begin // este BEGIN DE DONDE SALE.....
  22.          indice := 0; //Suponiendo que buffer sea un array de 1...x
  23.          for i := 1 to 255 do begin  //2 renglones, cambialo a los renglones que esperas
  24.              for j := 1 to 16 do begin //15 columnas
  25.                  stringgrid1.Cells[j,i] := inttohex(Buffer[indice],2);
  26.                  inc(indice);
  27.              end;
  28.          end;
  29.        end;
  30.        Str:= Str + #32 + IntToHex(Buffer[i],2);
  31.        if ((i+1) mod 16 = 0) then begin
  32.           Memo1.Lines.Add(Str);
  33.           Str:= EmptyStr;
  34.        end;
  35.        if Str <> EmptyStr then
  36.           Memo1.Lines.Add(Str);
  37.      finally
  38.         Free;
  39.      end;
  40. end;



Salud OS
  • 0

#6 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 03 noviembre 2008 - 05:24

Bueno asi esta declarado:


delphi
  1. Buffer: TBuffer;



No tengo ningun array en este codigo.

Un Saludo.

#7 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 03 noviembre 2008 - 05:31

Disculpa ego jejejejeje tienes mucha razon:


delphi
  1. //Aqui declaramos el Tipo BUFFER
  2. type
  3. TBuffer = array[$0000..$FFFF] of Byte;



Pero este TBuffer no tiene nada que ver con "Buffer"?

Ahora me nortie. jejejeje :-\

#8 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 03 noviembre 2008 - 05:48

Eliminado el begin y un end:


delphi
  1. procedure TForm1.OpenFileClick(Sender: TObject);
  2. var
  3.   i,j,indice: integer;
  4.   Str: String;
  5. begin
  6.   if OpenDialog1.Execute then
  7.      Edit1.Text:=OpenDialog1.FileName;
  8.   Memo1.Clear;
  9.   //Inicializo las columnas y filas de el stringgrid donde se inicia la escritura
  10.   with TStringList.Create do
  11.      try
  12.        if FileExists(Edit1.Text) then begin
  13.           LoadFromFile(Edit1.Text);
  14.           FillChar(Buffer,Sizeof(Buffer),#255);
  15.           for i:= 0 to Count - 1 do
  16.               Insertar(Strings[i],Buffer);
  17.           j:= StrToInt(Bufsize.caption);
  18.           Str:= EmptyStr;
  19.        end;
  20. //*****************************************************
  21.      //  begin // este BEGIN DE DONDE SALE.....
  22.          indice := 0; //Suponiendo que buffer sea un array de 1...x
  23.          for i := 1 to 255 do begin  //2 renglones, cambialo a los renglones que esperas
  24.              for j := 1 to 16 do begin //15 columnas
  25.                  stringgrid1.Cells[j,i] := inttohex(Buffer[indice],2);
  26.                  inc(indice);
  27.              end;
  28.          end;
  29.       // end;
  30.        Str:= Str + #32 + IntToHex(Buffer[i],2);
  31.        if ((i+1) mod 16 = 0) then begin
  32.           Memo1.Lines.Add(Str);
  33.           Str:= EmptyStr;
  34.        end;
  35.        if Str <> EmptyStr then
  36.           Memo1.Lines.Add(Str);
  37.      finally
  38.         Free;
  39.      end;
  40. end;



Estaban sobrando.Es que copie ese codigo de otro programita que tengo y se colaron. :-[

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.259 mensajes
  • LocationMéxico

Escrito 03 noviembre 2008 - 05:54

Con razón, porque no tenia sentido amigo Jose Fco.

Salud OS
  • 0

#10 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 03 noviembre 2008 - 05:59

Con razón, porque no tenia sentido amigo Jose Fco.

Salud OS

Tengo que limpiar bien ese codigo y entenderlo al 100%.Trabajare mucho con stringrid, cargando files y salvando files de el.Es algo que nunca logre hacer y que me es indispensable lograr. ;)

Un Saludo.
PD:El fin de semana trabajare en eso.

#11 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 04 noviembre 2008 - 05:40

Una ves el maestro seoane recuerdo que me dijo que si tenia que manipular una data que ya estaba en un buffer, no era recomendable manipularla de un memo.Esto era trabajar dos veces.Eso lo entiendo ahora, en ese entonces no entendi muy bien.
La pregunta ahora es la siguiente.Si yo esa data la tengo en un stringgrid y la quiero poder manipular(entiendace mandarla a un scope por ejemplo) de a poco byte por byte y teniendo la ayuda de un timer para en el evento ontimer poder manipular una casilla a la vez.Eso tambien lo podria hacer de un buffer.Pero el buffer no me daria la ventaja que un grid si me daria y es poder escoger un grupo determinado de casillas y moverlas a mi gusto.¿En un buffer esto no es posible?

Un Saludo.

#12 seoane

seoane

    Advanced Member

  • Moderador
  • PipPipPip
  • 1.257 mensajes
  • LocationEspaña

Escrito 05 noviembre 2008 - 04:08

Vamos a definir el terreno de juego. Tenemos un StringGrid, que llamaremos StringGrid1, que tiene 17 columnas de ancho y un numero suficiente de filas de alto (esto depende del tamaño de los datos). Tanto la primera columna como la primera fila son fijas (FicedRows, FixedCols) por lo que los datos se empezaran a escribir en la celda 1,1. Tambien disponemos de un Opendialog que llamaremos OpenDialog1.

Teniamos este codigo (el tamaño del buffer tiene que ser ese y no otro):
[Delphi=delphi]
type
  TBuffer = array[$0000..$FFFF] of Byte;

// Insertamos la linea de datos en un buffer
function Insertar(Str: String; var Buffer: TBuffer): String;
var
  i,j,k: Integer;
begin
  Result:= EmptyStr;
  Str:= Trim(Str);
  if Copy(Str,1,1) = ':' then
    if TryStrToInt('$' + Copy(Str,2,2),i) then
      if Length(Str) = ((2*i) + 11) then
        if TryStrToInt('$' + Copy(Str,4,4),j) then
          if TryStrToInt('$' + Copy(Str,8,2),k) then
            if k = 0 then
            begin
              Str:= Copy(Str,10,2*i);
              for k:= j to (j + i - 1) do
              begin
                Buffer[k]:= StrToInt('$' + Copy(Str,1,2));
                Delete(Str,1,2);
              end;
            end;
end;
[/Delphi]

Para cargar la informacion en el StringGrid colocamos el siguiente codigo, poe ejemplo, en el evento de un boton:
[Delphi=delphi]
var
  i,j: Integer;
  Buffer: TBuffer;
begin
  if OpenDialog1.Execute then
  begin
    for i:= 0 to StringGrid1.RowCount - 1 do
      StringGrid1.Rows[i].Clear;
    with TStringList.Create do
    try
      LoadFromFile(OpenDialog1.Filename);
      // Llenamos todo el buffer con $FF
      FillChar(Buffer,Sizeof(Buffer),#$FF);
      // Leemos el archivo linea a linea e insertamos los datos en el buffer
      for i:= 0 to Count - 1 do
        Insertar(Strings[i],Buffer);
      for j:= 1 to StringGrid1.RowCount - 1 do
        for i:= 1 to StringGrid1.ColCount - 1 do
          StringGrid1.Cells[i,j]:= IntToHex(Buffer[((j-1)*16)+i-1],2);
    finally
      Free;
    end;
  end;
end;
[/Delphi]

Y ya esta. Seria conveniente que el buffer fuera una variable global, o al menos comun a todos los procedimientos del formulario, de esta forma podemos utilizar los datos leidos del fichero en otras cosas, por ejemplo mandarlas a un scope sin necesidad de volver a convertir los datos del stringgrid a bytes
  • 0

#13 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 05 noviembre 2008 - 04:42

Gracias seoane, el problema era que tenia algunas cosas mezcladas en ese codigo y era por la razon de que al principio yo tenia ese file en un Memo.Despues lo meti en un stringgrid y fue donde algunas cosas estaban de mas.

Un Saludo.

#14 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 09 noviembre 2008 - 09:24

OK yo tengo una rutina que crea el stringgrid y le pone el encabezado a las columnas  0 hasta F y le pone a los ROWs el address desde 0000 a la 0FFF.
Cuando pongo este codigo me borra esa parte:


delphi
  1. #
  2. for i:= 0 to StringGrid1.RowCount - 1 do
  3. #
  4.     StringGrid1.Rows[i].Clear;
  5. #
  6.   with TStringList.Create do



Creo que esta es la parte del codigo que me esta borrando eso.
Un Saludo.

#15 seoane

seoane

    Advanced Member

  • Moderador
  • PipPipPip
  • 1.257 mensajes
  • LocationEspaña

Escrito 09 noviembre 2008 - 09:35

Creo que esta es la parte del codigo que me esta borrando eso.

Correcto, usa esto en su lugar


delphi
  1. for i:= 1 to StringGrid1.RowCount - 1 do
  2.       StringGrid1.Rows[i].Clear;


  • 0

#16 seoane

seoane

    Advanced Member

  • Moderador
  • PipPipPip
  • 1.257 mensajes
  • LocationEspaña

Escrito 09 noviembre 2008 - 09:48

Creo que tengo que pensar antes de responder  :D

Olvida mi ultimo mensage y simplemente elimina estas dos lineas del codigo:


delphi
  1. for i:= 0 to StringGrid1.RowCount - 1 do
  2.       StringGrid1.Rows[i].Clear;



  • 0

#17 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 09 noviembre 2008 - 09:53


Creo que esta es la parte del codigo que me esta borrando eso.

Correcto, usa esto en su lugar


delphi
  1. for i:= 1 to StringGrid1.RowCount - 1 do
  2.       StringGrid1.Rows[i].Clear;


Si ese era el problema. :)
Ahora solo tengo que reparar el que yo solo en el procedure de stringgrid creo hasta el address 0FFF y en el procedure este ultimo estoy llenando hasta el FFFF y se crea el conflicto.


delphi
  1. procedure TForm1.InicializaGridBuffer;
  2. var
  3.    i,r,j,k,l: integer;
  4. begin
  5.  StringGrid1.ColWidths[0] := 35;
  6.  StringGrid1.Cells[0,0] := 'Addr';
  7.  
  8.  for i := 0 to 15 do
  9.    StringGrid1.Cells[i+1,0] := IntTohex(i,2);
  10.    for j := 0 to (BufferSize div 16)-1 do    // (BufferSize div 16)
  11.    begin
  12.      k := j;
  13.      StringGrid1.Height := StringGrid1.Height + 1;
  14.      StringGrid1.RowCount := StringGrid1.RowCount + 1;
  15.      StringGrid1.Cells[0,k+1] := IntToHex(l,4);
  16.      l := l + 16;
  17.      for r := 1 to 16 do
  18.      StringGrid1.Cells[r,k+1] := IntToHex(255,2);
  19.  
  20. end;
  21. end;


porque digo BufferSize y declaro:


delphi
  1. public
  2.    { Public declarations }
  3.  end;
  4. const
  5.  BufferSize = 4096;


Aqui tengo otro conflicto pero facil de reparar.

Un Saludo.

#18 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 09 noviembre 2008 - 09:53

Creo que tengo que pensar antes de responder  :D

Olvida mi ultimo mensage y simplemente elimina estas dos lineas del codigo:


delphi
  1. for i:= 0 to StringGrid1.RowCount - 1 do
  2.       StringGrid1.Rows[i].Clear;



ok dejame intentar eso.

#19 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 09 noviembre 2008 - 10:08

Ok eliminadas esas dos lineas y esta perfecto.Ya cambie el buffer Size = 65536 y ya me llena hasta la FFFF. :)


#20 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 09 noviembre 2008 - 11:01

Aqui hay un problema:


delphi
  1.   for j:= 1 to StringGrid1.RowCount - 1 do


Se pasa y no se detiene cuando llega a la ultima linea(row) del stringgrid.
En otro procedure que tengo j se controla su valor por el valor que contiene un label.


delphi
  1. procedure TForm1.OpenFileClick(Sender: TObject);
  2. var
  3.   i,j,indice: integer;
  4. Str: String;
  5. begin
  6. if OpenDialog1.Execute then
  7. Edit1.Text:=OpenDialog1.FileName;
  8.   Memo1.Clear;
  9.   //Inicializo las columnas y filas de el stringgrid donde se inicia la escritura
  10.     with TStringList.Create do
  11.     try
  12.     if FileExists(Edit1.Text) then
  13.     begin
  14.     LoadFromFile(Edit1.Text);
  15. FillChar(Buffer,Sizeof(Buffer),#255);
  16. for i:= 0 to Count - 1 do
  17. Insertar(Strings[i],Buffer);
  18. j:= StrToInt(Bufsize.caption);
  19. Str:= EmptyStr;
  20. end;
  21.   indice := 0; //Suponiendo que buffer sea un array de 1...x
  22.   for i := 1 to 255 do begin  //2 renglones, cambialo a los renglones que esperas
  23.     for j := 1 to 16 do begin //15 columnas
  24.         stringgrid1.Cells[j,i] := inttohex(Buffer[indice],2);
  25.         inc(indice);
  26.     end;
  27.   end;
  28.   Str:= Str + #32 + IntToHex(Buffer[i],2);
  29.             if ((i+1) mod 16 = 0) then
  30.               begin
  31.                 Memo1.Lines.Add(Str);
  32.                 Str:= EmptyStr;
  33.               end;
  34.  
  35.  
  36.       if Str <> EmptyStr then
  37.         Memo1.Lines.Add(Str);
  38.  
  39.     finally
  40.       Free;
  41.     end;
  42. end;


Con este procedure solo llena el stringgrid al tamaño que fue creado.
porque al crearlo le digo que es BufferSize= 4096 y el Bufsize.Caption tambien es 4096.

Un Saludo.