Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Direccionar un StringGrid. (https://www.clubdelphi.com/foros/showthread.php?t=60797)

JoseFco 14-10-2008 16:49:48

Direccionar un StringGrid.
 
Hola amigos, tengo una idea y me gustaria ver si esto puede ser posible.

Tengo este StringGrid y me gustaria poder asociarle un addr a sus casillas.




La idea es poder acceder a las casillas mediante una direcion.

Ejemplo 0001 Col 1 Row 0 , que esta data la tome de un label.

¿No se si me explico bien?

Un Saludo.

Caro 14-10-2008 17:24:10

Hola Jose, se me ocurre que lo hagas de esta forma, por lo que he entendido la penultima posicion te dara la fila y la ultima la columna, como A, B, C... son hexadecimales que corresponden a 10,11, 12..., utilices eso, lo conviertas a decimal y accedas a esa fila y columna que corresponde.

Código Delphi [-]
var
 aCol, aRow : Integer;
 Cad : String;
begin
 Cad := Label1.Caption;
 
 aRow := StrToInt('$'+Cad[3])+1;
 aCol := StrToInt('$'+Cad[4])+1;
 
 StringGrid1.Col := aCol;
 StringGrid1.Row := aRow;

Saluditos

JoseFco 14-10-2008 17:45:36

Cita:

Empezado por Caro (Mensaje 319996)
Hola Jose, se me ocurre que lo hagas de esta forma, por lo que he entendido la penultima posicion te dara la fila y la ultima la columna, como A, B, C... son hexadecimales que corresponden a 10,11, 12..., utilices eso, lo conviertas a decimal y accedas a esa fila y columna que corresponde.


Código Delphi [-]
var
 aCol, aRow : Integer;
 Cad : String;
begin
 Cad := Label1.Caption;
 
 aRow := StrToInt('$'+Cad[3])+1;
 aCol := StrToInt('$'+Cad[4])+1;
 
 StringGrid1.Col := aCol;
 StringGrid1.Row := aRow;



Saluditos

Gracias Caro, veo que captastes la idea bien.:)

Llegando a la casa lo pruebo.


Un Saludo.

Caro 14-10-2008 18:00:00

Cita:

Empezado por JoseFco (Mensaje 320008)
Llegando a la casa lo pruebo.

Ok ;)

Saluditos

JoseFco 14-10-2008 23:47:48

Bueno asi esta la cosa:





Código Delphi [-]
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls;
type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Label1: TLabel;
    Button1: TButton;
    UpAddr: TButton;
    DownAddr: TButton;
    procedure InicializaGridBuffer;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure UpAddrClick(Sender: TObject);
    procedure DownAddrClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.InicializaGridBuffer;
var
  i,j: integer;
begin
  StringGrid1.ColWidths[0] := 35;
  StringGrid1.Cells[0,0] := 'Addr';
  j := $0000;
  for i := 0 to 15 do
    if i = 0 then
      begin
        StringGrid1.Cells[i+1,0] := IntTohex(i,2);
        StringGrid1.Cells[0,i+1] := IntToHex(i,4);
      end
    else
      begin
        j := j + 16;
        StringGrid1.Cells[i+1,0] := IntTohex(i,2);
        StringGrid1.Cells[0,i+1] := IntToHex(j,4);
      end;
      end;
procedure TForm1.FormCreate(Sender: TObject);
begin
InicializaGridBuffer;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
 aCol, aRow : Integer;
 Cad : String;
begin
Cad := Label1.Caption;
 aRow := StrToInt('$'+Cad[3])+1;
 aCol := StrToInt('$'+Cad[4])+1;
 StringGrid1.Col := aCol;
 StringGrid1.Row := aRow;
end;
procedure TForm1.UpAddrClick(Sender: TObject);
begin
 Label1.Caption := inttohex(strtoint('$'+Label1.Caption)+1,4);
end;
procedure TForm1.DownAddrClick(Sender: TObject);
begin
  Label1.Caption := inttohex(strtoint('$'+Label1.Caption)-1,4);
end;
end.


Eso quedo como queria.:)

Los botones Up and Down son solo para que el programita ruede y poder probarlo.(la idea futura es que el solo camine);)

Tengo un problemita y creo que es del codigo al crear el grid.Cuando el addr llega a la FF se retorna al 00 si es que pongo 01FF en el Label.Cuando creo el grid solo llego a la "FF".;)

Gracias Caro, muy buena tu ayuda.

Un Saludo.

PD:¿Que estoy tratando de hacer? No tengo idea pero algo saldra de todo esto.:D

JoseFco 15-10-2008 03:41:26

Bueno asi esta el relajo... Digo el codigo para direccionar el StringGrid:




El codigo:

Código Delphi [-]
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Label1: TLabel;
    Run: TButton;
    UpAddr: TButton;
    DownAddr: TButton;
    Timer1: TTimer;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    Edit1: TEdit;
    ValorCasilla: TLabel;
    Label2: TLabel;
    procedure InicializaGridBuffer;
    procedure FormCreate(Sender: TObject);
    procedure RunClick(Sender: TObject);
    procedure UpAddrClick(Sender: TObject);
    procedure DownAddrClick(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.InicializaGridBuffer;
var
  i,j: integer;
begin
  StringGrid1.ColWidths[0] := 35;
  StringGrid1.Cells[0,0] := 'Addr';
  j := $0000;
  for i := 0 to 15 do
    if i = 0 then
      begin
        StringGrid1.Cells[i+1,0] := IntTohex(i,2);
        StringGrid1.Cells[0,i+1] := IntToHex(i,4);
      end
    else
      begin
        j := j + 16;
        StringGrid1.Cells[i+1,0] := IntTohex(i,2);
        StringGrid1.Cells[0,i+1] := IntToHex(j,4);
      end;
      end;
procedure TForm1.FormCreate(Sender: TObject);
begin
InicializaGridBuffer;
end;
procedure TForm1.RunClick(Sender: TObject);
var
 aCol, aRow : Integer;
 x,y : Integer;
 Cad : String;
 begin
 Cad := Label1.Caption;
 aRow := StrToInt('$'+Cad[3])+1;
 aCol := StrToInt('$'+Cad[4])+1;
 StringGrid1.Col := aCol;
 StringGrid1.Row := aRow;
 x := aRow;
 y := aCol;
  ValorCasilla.Caption:= StringGrid1.Cells[y,x];
end;
procedure TForm1.UpAddrClick(Sender: TObject);
begin
 Label1.Caption := inttohex(strtoint('$'+Label1.Caption)+1,4);
end;
procedure TForm1.DownAddrClick(Sender: TObject);
begin
  Label1.Caption := inttohex(strtoint('$'+Label1.Caption)-1,4);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage(StringGrid1.Cells[6, 6]);
end;
procedure TForm1.Button3Click(Sender: TObject);
var
  i,j: integer;
  hexa: string;
begin
 hexa := Edit1.text;
 for i := 1 to 15 do begin
      for j := 1 to 15 do begin
          if Pos(' ',hexa) = 0 then
           begin
           StringGrid1.Cells[j,i] := hexa;
             Exit;
             end
          else begin
                 StringGrid1.Cells[j,i] := Copy(hexa,1,2);
                 Delete(hexa,1,Pos(' ',hexa));
          end;
      end;
  end;
end;
end.

Algunas cositas agregadas para ademas de mover el cursor dentro del grid que me retorne el valor en esa casilla en particular.Ademas de un Timer, para poder jugar con el tiempo.(en esta etapa no es tan importante, pero cuando esto tome forma y autonomia.Sera de mucho valor.);)

Un Saludo.

PD:Se aceptan criticas y sugerencias.La otra parte del proyecto la continuare en otro hilo.Para no salirme del tema de este.(no desvirtual)

Gracias Caro.

Caro 15-10-2008 18:10:07

Me alegra que te haya servido amiguito ;).

Solo una cosita en vez de asiganar a tus variables x y y, puedes utilizar directamente aRow y aCol.

Código Delphi [-]
............
 StringGrid1.Col := aCol;
 StringGrid1.Row := aRow;
 ValorCasilla.Caption:= StringGrid1.Cells[aCol, aRow];
end;
..........

Saluditos

JoseFco 15-10-2008 18:54:05

Cita:

Empezado por Caro (Mensaje 320261)
Me alegra que te haya servido amiguito ;).

Solo una cosita en vez de asiganar a tus variables x y y, puedes utilizar directamente aRow y aCol.


Código Delphi [-]
............
StringGrid1.Col := aCol;
StringGrid1.Row := aRow;
ValorCasilla.Caption:= StringGrid1.Cells[aCol, aRow];
end;
..........





Saluditos

Gracias Caro, no recuerdo si anoche intente de esa forma o no.Pero llegando a la casa le hago el cambio.;)


Un Saludo.

JoseFco 16-10-2008 00:35:56

Hola Caro.

Eso quedo perfecto y a las mil marabillas.Gracias.:)


Un Saludo.


PD:Pence que el asunto con las direciones en un StringGrid ya estaba resuelto del todo y pues se me ocurre que puedo crear un componente usando una. Un LCD de 16 caracteres y dos lineas.(aprovechando que puedo asignarle el address real que un LCD trae.En unos dias posteo la idea completa, en este mismo hilo para darle continuidad a la idea de asignar address a los StringGrid.;)

JoseFco 18-10-2008 02:41:44

Hola amigos.

Tengo un problemita con este codigo:


Código Delphi [-]
procedure TForm1.RunClick(Sender: TObject);
var
 aCol, aRow : Integer;
 Cad : String;
 begin
 Cad := Label1.Caption;
 aRow := StrToInt('$'+Cad[3])+1;
 aCol := StrToInt('$'+Cad[4])+1;
 StringGrid1.Col := aCol;
 StringGrid1.Row := aRow;
  ValorCasilla.Caption:= StringGrid1.Cells[aCol, aRow];
end;

Esto esta trabajando sin problemas desde la address 00 a la FF.Toma el valor de Label1.Caption (Cad)
Código Delphi [-]
aCol := StrToInt('$'+Cad[4])+1;

Esto esta bien porque esta tomando el valor del digito 4 del Label1(hex es lo que tiene el label)Por eso el StrToInt.
Esta linea de codigo es para recorrer los Col del grid (una linea) 0 a la F tengo mis 16 valores.;) esto esta perfecto aqui no hay problema.

El Problema:
Código Delphi [-]
aRow := StrToInt('$'+Cad[3])+1;

Esta en esta linea. Toma el valor del digito 3 del Label1 y pues solo llegara a la F. La cosa es cuando llega a la FF deberia seguir al address 100h.Pero con este codigo tomando solo el digito 3 ni mandraca el mago lo lograria.:D
tengo que tener un For i: 1 to 256 y poder lograr que al llegar a la F el maximo valor del digito 3 ya que es Hex entonces que comience a contar con el digito 2 tambien.

¿No se si me explique bien.?

Alguna idea de como lograr esto?

Un Saludo.

JoseFco 19-10-2008 01:22:10

Bueno Amigos.

Resuelto el problema.:)

Código Delphi [-]
procedure TForm1.RunClick(Sender: TObject);
var
 aCol, aRow : Integer;
 Cad : String;
 begin
 Cad := Label1.Caption;
 aRow := StrToInt('$'+Cad[2]+Cad[3])+1;
 aCol := StrToInt('$'+Cad[4])+1;
 StringGrid1.Col := aCol;
 StringGrid1.Row := aRow;
  ValorCasilla.Caption:= StringGrid1.Cells[aCol, aRow];
end;

Un dolorcito de cabeza, pero al final las ideas se aclararon.;)

Un Saludo.


La franja horaria es GMT +2. Ahora son las 05:38:44.

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