Ir al contenido


Foto

problemas con cabeceras de StringGrid1 Lazarus. Ayuda


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

#1 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 13 abril 2015 - 02:06

Tengo un StringGrid1 con varias filas y columnas. He conseguido que el procedimiento
 
 


delphi
  1. procedure TForm1.StringGrid1SelectCell(Sender: TObject; aCol, aRow: Integer;
  2.   var CanSelect: Boolean);   

 
                         
 
que al seleccionar con un click una celda me marque la fila entera con la opción(TstringRid1 en Options.-<goRowSelect=TRUE) en azul.
 
Mi intención es que al hacer dobleclick sobre una fila entera marcada en azul me salga un formulario. Esto lo consigo
con el procedimiento
 
 


delphi
  1. procedure TForm1.StringGrid1DblClick(Sender: TObject);
  2. Var
  3.   MousePos : TPoint;  ThisCell : TPoint;
  4. begin
  5.   MousePos := Mouse.CursorPos;
  6.   ThisCell := StringGrid1.MouseToCell(MousePos);
  7.      //ShowMessage('Stringgrid context popup with Mouse.X and .Y = '+IntToStr(MousePos.X)+
  8.      //' and '+IntToStr(MousePos.Y)+' and with Col and Row = '+IntToStr(ThisCell.X)+' and '+IntToStr(ThisCell.Y));
  9. end;  

 
Pero no lo hace bien. Al pulsar cualquier fila con dobleclick veo el nº de fila pulsada con stringrid1.row y el nº de columna con stringrid1.col,  pero al pulsar sobre la cabecera tambien me indica el nº fila pero no me saca la fila 0, sino que me marca el nº de fila donde está marcada la fila en azul y puede estar marcada por ejemplo la fila 5 en azul y cuando pulso la cabecera me saca nº de fila=5 y me tendría que sacar nºde fila =0..
 
Por lo tanto no se como corregir esto para que funcione ya que intento indicarle
 
 


delphi
  1. IF (Stringrid1.row <>0) then // Si dobleclik sobre cualquier fila distinta a la cabecera saco un Form2.
  2.      Form2.show();

 
 
pero es imposible ya que ocurre lo anterior. Una posible ayuda al respecto
Gracias.


escafandra: edito para poner las etiquetas de código.


  • 0

#2 tmsanchez

tmsanchez

    Advanced Member

  • Miembros
  • PipPipPip
  • 85 mensajes

Escrito 13 abril 2015 - 07:01

Que tal, esta es una idea que espero te sea de utilidad.

 

En un datamodule obtienes tus datos que vas a mostrar en un grid:


delphi
  1. unit Unit2;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8. Classes, SysUtils, FileUtil;
  9.  
  10. type
  11. TPersona = record
  12. clave: Integer;
  13. nombre: String;
  14. end;
  15.  
  16. TArrPersona = array [1..10] of TPersona;
  17.  
  18. { TDMDatos }
  19.  
  20. TDMDatos = class(TDataModule)
  21. procedure DataModuleCreate(Sender: TObject);
  22. private
  23. { private declarations }
  24. procedure llenaArregloPersonas;
  25. public
  26. { public declarations }
  27. personas : TArrPersona;
  28. function obtenPersona(indice: integer):TPersona;
  29. function cuantasFilas : Integer;
  30. end;
  31.  
  32. var
  33. DMDatos: TDMDatos;
  34.  
  35. implementation
  36.  
  37. {$R *.lfm}
  38.  
  39. { TDMDatos }
  40.  
  41. procedure TDMDatos.DataModuleCreate(Sender: TObject);
  42. begin
  43. llenaArregloPersonas;
  44. end;
  45.  
  46. procedure TDMDatos.llenaArregloPersonas;
  47. var
  48. i : Integer;
  49. begin
  50. for i := 1 to 10 do
  51. begin
  52. personas[i].clave := i;
  53. personas[i].nombre := 'NOMBRE ' + intToStr(i);
  54.  
  55. end;
  56. end;
  57.  
  58. function TDMDatos.obtenPersona(indice: integer): TPersona;
  59. var
  60. laPersona : TPersona;
  61. begin
  62. laPersona := personas[indice];
  63. result := laPersona;
  64. end;
  65.  
  66. function TDMDatos.cuantasFilas: Integer;
  67. begin
  68. result := High(personas);
  69. end;
  70.  
  71. end.

y tienes la forma donde esta el grid y ahi el grid esta con la propiedad rowSelect a true:


delphi
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8. Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
  9. StdCtrls;
  10.  
  11. type
  12.  
  13. { TForm1 }
  14.  
  15. TForm1 = class(TForm)
  16. btnMostrar: TButton;
  17. grdDatos: TStringGrid;
  18. lblFilaSeleccionada: TLabel;
  19. procedure btnMostrarClick(Sender: TObject);
  20. procedure FormCreate(Sender: TObject);
  21. procedure grdDatosDblClick(Sender: TObject);
  22. procedure grdDatosSelection(Sender: TObject; aCol, aRow: Integer);
  23. private
  24. { private declarations }
  25. filaSeleccionada : Integer;
  26. procedure llenaElGrid();
  27. public
  28. { public declarations }
  29. end;
  30.  
  31. var
  32. Form1: TForm1;
  33.  
  34. implementation
  35.  
  36. uses Unit2, Unit3;
  37.  
  38. {$R *.lfm}
  39.  
  40. { TForm1 }
  41.  
  42. procedure TForm1.FormCreate(Sender: TObject);
  43. begin
  44. llenaElGrid();
  45. end;
  46.  
  47. procedure TForm1.btnMostrarClick(Sender: TObject);
  48. begin
  49. form2 := Tform2.Create(Self);
  50. form2.registroSeleccionado:= filaSeleccionada;
  51. form2.showModal;
  52. end;
  53.  
  54. procedure TForm1.grdDatosDblClick(Sender: TObject);
  55. begin
  56.  
  57. end;
  58.  
  59. procedure TForm1.grdDatosSelection(Sender: TObject; aCol, aRow: Integer);
  60. begin
  61. filaSeleccionada := aRow;
  62. lblFilaSeleccionada.caption := Format('Fila Seleccionada %d',[filaSeleccionada] );
  63. end;
  64.  
  65. procedure TForm1.llenaElGrid;
  66. var
  67. indice :Integer;
  68. cuantas : Integer;
  69. begin
  70. grdDatos.Cells[0,0] := 'No.';
  71. grdDatos.Cells[1,0] := 'Clave';
  72. grdDatos.Cells[2,0] := 'Nombre';
  73. cuantas := DMDatos.cuantasFilas ;
  74. grdDatos.RowCount:= cuantas +1;
  75. for indice := 1 to cuantas do
  76. begin
  77. grdDatos.Cells[0,indice] := intToStr(indice);
  78. grdDatos.Cells[1,indice] := intToStr(DMDatos.personas[indice].clave);
  79. grdDatos.Cells[2,indice] := DMDatos.personas[indice].nombre;
  80.  
  81. end;
  82. end;
  83.  
  84. end.

Y la forma donde muestras el registro seleccionado:


delphi
  1. unit Unit3;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8. Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  9. Unit2;
  10.  
  11. type
  12.  
  13. { TForm2 }
  14.  
  15. TForm2 = class(TForm)
  16. edtClave: TEdit;
  17. edtNombre: TEdit;
  18. Label1: TLabel;
  19. Label2: TLabel;
  20. procedure FormShow(Sender: TObject);
  21. private
  22. { private declarations }
  23. public
  24. { public declarations }
  25. registroSeleccionado :Integer;
  26. end;
  27.  
  28. var
  29. Form2: TForm2;
  30.  
  31. implementation
  32.  
  33. {$R *.lfm}
  34.  
  35. { TForm2 }
  36.  
  37. procedure TForm2.FormShow(Sender: TObject);
  38. begin
  39. edtClave.text := intToStr(DMDatos.obtenPersona(registroSeleccionado).clave);
  40. edtNombre.text := DMDatos.obtenPersona(registroSeleccionado).nombre;
  41. end;
  42.  
  43. end.

Echale un vistado al proyecto completo: https://www.dropbox....nggrid.zip?dl=0

 

Saludos.


  • 1

#3 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 14 abril 2015 - 02:43

Gracias tmsanchez por el aporte (cogido el codigo fuente para cambios y analisis del mismo). Pero quisiera saber donde está el error el mi codigo y que estoy haciendo mal en él, ya que si hago doble click sobre cualquier fila que no sea la cabecera sí me lo hace correctamente y detecta la fila correcta.

 

Una ayuda con mi codigo para aprender del error...

 

Un saludo


  • 0

#4 Nikolas

Nikolas

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 604 mensajes
  • LocationMar del Plata / Bs As / Argentina

Escrito 14 abril 2015 - 07:44

hola

creo que es porque las grillas fixed no leen eventos, por eso no te funciona.

 

por las dudas podes leer esto: http://wiki.lazarus...._Reference_Page

 

se me ocurre una solucion rapida que seria utilizar los encabezados fuera de la grilla, en algun Tlabel


  • 1

#5 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 14 abril 2015 - 08:49

hola

creo que es porque las grillas fixed no leen eventos, por eso no te funciona.

 

por las dudas podes leer esto: http://wiki.lazarus...._Reference_Page

 

se me ocurre una solucion rapida que seria utilizar los encabezados fuera de la grilla, en algun Tlabel

 

Gracias por tu respuesta. Lo raro es si pulso doble click sobre cualquier fila que no sea la cabecera sí me marca bien la fila que he pulsado (fila=1; ó fila=2 .....) según la fila que haya hecho dobleclick. Cuando pulso sobre la cabecera, me debería indicar la fila=0; pues en vez de eso, me marca la fila seleccionada en color azul, no tendrá que ver algo con esto ultimo? Mi intención es con la fila seleccionada si pulso dobleclick sacar un form2 con la info de la fila, pero veo que va a ser imposible.

 

Por más que le doy vueltas no consigo darle alguna solución.

 

 


  • 0

#6 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 14 abril 2015 - 02:40

Pues haciendo pruebas si desactivo el fixedrows dejandolo a = 0 si saca correctamente la fila = 0 cuando hago dobleclik, pero claro la cabecera del stringGrid1 me desaparece y tambien los iconos de la mism y sus nombre de columnas ya que los tengo con un imagelist.

 

Que hacer ante esto? Veo que el codigo está  correcto, pero no consigo salir del atolladero.

 

Gracias


  • 0

#7 Nikolas

Nikolas

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 604 mensajes
  • LocationMar del Plata / Bs As / Argentina

Escrito 14 abril 2015 - 05:58

Pues haciendo pruebas si desactivo el fixedrows dejandolo a = 0 si saca correctamente la fila = 0 cuando hago dobleclik, pero claro la cabecera del stringGrid1 me desaparece y tambien los iconos de la mism y sus nombre de columnas ya que los tengo con un imagelist.

 

Que hacer ante esto? Veo que el codigo está  correcto, pero no consigo salir del atolladero.

 

Gracias

 

claro perdes la cabecera, no te sirve poneslas afuera a mano en tlabel?

¿me explico?


  • 0

#8 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 14 abril 2015 - 11:02

Hola dooper.
 
No se en Lazarus, pero En Delphi la cabecera no es la fila 0, es la 1
 


delphi
  1. procedure TForm1.StringGrid1DblClick(Sender: TObject);
  2. begin
  3.     ShowMessageFmt('presionada fila %d, columna %d', [StringGrid1.Row, StringGrid1.Col]);
  4. end;

 

 
Me imprime 1,1 al hacer doble click en la cabecera de un StringGrid con RowSelect a true
 
Lo que no entiendo es porque te complicas tanto usando TPoint y MouseToCell cuando directamente puedes usar las propiedades Row y Col para acceder a la Fila/Columna seleccionadas (Esto, parentesis aparte, como consejo)
 
Esta es una solucion que encontre a tu problema, veamos si otro compañero plantea algo mejor. Para que te funcione deberás poner a True la propiedad goFixedRowClick de tu TStringGrid, es decir, permitir los click en la cabecera


delphi
  1. procedure TForm1.StringGrid1DblClick(Sender: TObject);
  2. var OtherForm: TForm1;
  3. begin
  4. if StringGrid1.Row > 0 then
  5. begin
  6. OtherForm := TForm1.Create(Self);
  7. OtherForm.ShowModal;
  8. end;
  9. end;
  10.  
  11. procedure TForm1.StringGrid1FixedCellClick(Sender: TObject; ACol,
  12. ARow: Integer);
  13. var
  14. ZeroRect: TGridRect;
  15. begin
  16. ZeroRect.Left := 0;
  17. ZeroRect.Top := 0;
  18. ZeroRect.Bottom := 0;
  19. ZeroRect.Right := 0;
  20. StringGrid1.Selection := ZeroRect;
  21. end;


  • 1

#9 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 15 abril 2015 - 12:10

Gracias OrtuAgustin por tu inestimable ayuda.

 

En Lazarus, a mi la primera fila es la 0 (cabeceras) y las columnas (1,2,3,4.....)

 

 

La respuesta a tu pregunta de porque uso 

 

procedure TForm1.StringGrid1SelectCell(Sender: TObject; aCol, aRow: Integer;
  var CanSelect: Boolean);    

 

es porque según mis novatos conocimientos, lo que consigo con este procedimiento es que al pulsar sobre una celda cualquiera

del StringGrid1 al tener en la variable aCol y ARow donde me registra la fila y columna pulsada, vuelco los datos de la fila entera a unos textbox (sabiendo ya la fila que he pulsado .Arow), y con la opción <goRowSelect=TRUE) se cambia la fila a color azul completamente indicando que es la fila activa.

 

No entiendo bien lo que hace el procedimiento StringGrid1FixedCellClick ni las variables ya que son para mi nuevas, y el procedimiento tiene uso de OOP y cuesta al principio pero nada mejor que coger hábitos al principio con estos casos.

 

procedure TForm1.StringGrid1FixedCellClick(Sender: TObject; ACol,

ARow: Integer);

 

El otro procedure anterior si lo comprendo ya comprueba que la fila sea > 0 (no cabecera) y saco un form.

 

Como ya digo tengo el problema a medias.


  • 0

#10 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 15 abril 2015 - 10:10

Hola de nuevo dooper

 

Disculpame si no me explique del todo bien

 

El evento OnFixedClickCell se dispara cuando se hace click en alguna de las columnas que van "fijas". En tu caso la cabecera.

 

A priori, podrias modificar la fila seleccionada utilizando la propiedad row, pero nunca te dejará seleccionar la cabecera (que quede como decis, marcada con azul y por ende seria la activa)

 

Entonces lo que hago es uso de la propiedad Selection del grid, que te permite llamemoslo "seleccionar de otra manera" filas y columnas. Podrias hacer hasta seleccion multiple. Imaginate que TRect es un rectangulo que va a "seleccionar" las filas comprendidas en el rango que le indiques entre las propiedades Top - Bottom, y las columnas comprendidas en el rango Left - Right. Si le ponemos todo a 0, entonces seleccionaria la cabecera.

 

Acordate que esto solamente ocurriria si alguien hace click en la cabecera, al hacer al menos un click. Si hacen doble click, el evento se dispara en el primero y en el segundo, se dispara el evento OnDblClick, que es el que ya tenes codificado, la fila seleccionada en este caso va a ser efectivamente la cabecera (la 0 en Lazarus) y podrias validarla correctamente

 

Saludos


  • 1

#11 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 15 abril 2015 - 02:11

Hola de nuevo dooper

 

Disculpame si no me explique del todo bien

 

El evento OnFixedClickCell se dispara cuando se hace click en alguna de las columnas que van "fijas". En tu caso la cabecera.

 

A priori, podrias modificar la fila seleccionada utilizando la propiedad row, pero nunca te dejará seleccionar la cabecera (que quede como decis, marcada con azul y por ende seria la activa)

 

Entonces lo que hago es uso de la propiedad Selection del grid, que te permite llamemoslo "seleccionar de otra manera" filas y columnas. Podrias hacer hasta seleccion multiple. Imaginate que TRect es un rectangulo que va a "seleccionar" las filas comprendidas en el rango que le indiques entre las propiedades Top - Bottom, y las columnas comprendidas en el rango Left - Right. Si le ponemos todo a 0, entonces seleccionaria la cabecera.

 

Acordate que esto solamente ocurriria si alguien hace click en la cabecera, al hacer al menos un click. Si hacen doble click, el evento se dispara en el primero y en el segundo, se dispara el evento OnDblClick, que es el que ya tenes codificado, la fila seleccionada en este caso va a ser efectivamente la cabecera (la 0 en Lazarus) y podrias validarla correctamente

 

Saludos

No comprendo tu explicacion Ortu.

 

"A priori, podrias modificar la fila seleccionada utilizando la propiedad row, pero nunca te dejará seleccionar la cabecera (que quede como decis, marcada con azul y por ende seria la activa)"

 

La cabecera en mi caso no quedar nunca marcada y en azul, si me indica al dobleclick que es la 1,2... según que fila esté seleccionada en azul.

 

He visto la nuevoa forma de "selección" de las filas y columnas algo nuevo, acostumbrado acol y arow.

 

Si hacen doble click, el evento se dispara en el primero y en el segundo, se dispara el evento OnDblClick, que es el que ya tenes codificado, la fila seleccionada en este caso va a ser efectivamente la cabecera (la 0 en Lazarus) y podrias validarla correctamente....

 

No entiendo este paso, si hago dobleclick en la cabecera me saldría ya fila =0; y si pulso cualquier fila distinta me saldría la fila correctamente?

Es que no veo por donde se hace la comparativa si pulso una celda donde devuelve la fila y columna (Acol, y Arow) ya que yo uso Arow para saber la fila donde se ha seleccionado con un click de ratón.

 

un saludo


  • 0

#12 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 15 abril 2015 - 02:19

He puesto tu codigo Ortu y seguimos igual, al dobleclick sobre la cabecera me salga el form2.show(); cuando no debería sacarlo, cuando pulso dobleclick sobre cualquier fila distinta me saca correctamente el form2.

 

No consigo doblegarme al problema...

 

Un saludo


  • 0

#13 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 15 abril 2015 - 02:58

SE me olvidaba cuando hago dobleclick sobre la cabecera, está me indica que la fila=1; luego nunca me indica =0, al pasar por este codigo:

 

if StringGrid1.Row > 0 then
    begin
        OtherForm := TForm1.Create(Self);
        OtherForm.ShowModal;
    end

 

me saca tambien el form2, ya que la fila =1 pero porque la fila activa en azul está en ese momento en la fila=1, si clickeo una vez en la fila=4 por ejemplo, cuando vuelva dar a la cabecera me indica que fila=4 aunque haga pulsado dobleclick sobre la fila=0, estoy en la misma fase que mi código.

 

Ya no se como resolver el problema...


  • 0

#14 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 15 abril 2015 - 04:50

Buscando un poco en Google encontré esta idea... podría servirte creo yo...


delphi
  1. procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button:
  2. TMouseButton;
  3. Shift: TShiftState; X, Y: Integer);
  4. var
  5. ACol, ARow: Integer;
  6. begin
  7. StringGrid1.MouseToCell(x, y, ACol, ARow);
  8. if ACol <= StringGrid1.FixedCols-1 then
  9. ShowMessage('Clicked on Fixed Column'); // <-- aquí podrías tener una variable global que controle si la columna es fixed o no
  10. end;

Saludox ! :)


  • 0

#15 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 15 abril 2015 - 08:10

Intenta modificando el procedimiento anterior asi

delphi
  1. procedure TForm1.StringGrid1FixedCellClick(Sender: TObject; ACol,
  2. ARow: Integer);
  3. var
  4. ZeroRect: TGridRect;
  5. begin
  6. ZeroRect.Left := 1;
  7. ZeroRect.Top := 1;
  8. ZeroRect.Bottom := 1;
  9. ZeroRect.Right := 1;
  10. StringGrid1.Selection := ZeroRect;
  11. end;

Saludos

Edito:
 
En realidad si la fila fixed es la nro 1 en Lazarus, entonces seria adecuado tambien modificar el otro evento:
 
 

delphi
  1. procedure TForm1.StringGrid1DblClick(Sender: TObject);
  2. var OtherForm: TForm1;
  3. begin
  4. if StringGrid1.Row > 1 then
  5. begin
  6. OtherForm := TForm1.Create(Self);
  7. OtherForm.ShowModal;
  8. end;
  9. end;


  • 0

#16 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 16 abril 2015 - 08:05

Nada Ortu, tu codigo no funciona como quiero. De esta manera cuando pulso sobre la cabecera me indica fila=1, pero claro porque está en azul marcada la fila=1; si a continuación marco con un click la fila=4; e inmediatamente vuelvo a pulsar la cabecera me dice que la fila=4; porque ahora estaría seleccionada la fila=4;

 

La solución es quitar el fixedRow; pero claro no es solución alguna. Fenareth me indica otra solución pero no es dobleclick el evento y además indica que controle si la columna es fixed, como se comprueba que una columna pulsadao con dobleclick sea fixed o no? vere

 

Me tiene un poco desesperado el tema porque o quito como digo las columnas fixed, o el problema puede venir por la selección de un click que hago o no...

 

Un saludo


  • 0

#17 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 16 abril 2015 - 08:11

Nada Ortu, tu codigo no funciona como quiero. De esta manera cuando pulso sobre la cabecera me indica fila=1, pero claro porque está en azul marcada la fila=1; si a continuación marco con un click la fila=4; e inmediatamente vuelvo a pulsar la cabecera me dice que la fila=4; porque ahora estaría seleccionada la fila=4;

 

La solución es quitar el fixedRow; pero claro no es solución alguna. Fenareth me indica otra solución pero no es dobleclick el evento y además indica que controle si la columna es fixed, como se comprueba que una columna pulsadao con dobleclick sea fixed o no? vere

 

Me tiene un poco desesperado el tema porque o quito como digo las columnas fixed, o el problema puede venir por la selección de un click que hago o no...

 

Un saludo

 

A mi me parece un problema de evento, es decir, en el evento OnClick te muestra la última fila seleccionada, lo que hay que validar es que el mensaje sea hasta que entra a la fila, ésto lo digo conceptualmente, habrá que hacer pruebas hasta encontrar el evento que te muestre la fila correcta.

 

Saludos


  • 0

#18 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 16 abril 2015 - 08:21

En el código que yo te propongo, la línea


delphi
  1. if ACol <= StringGrid1.FixedCols-1 then

es la que te indica si la columna a la que le hiciste click es fixed o no, yo por eso decía que hicieras algo así:


delphi
  1. //Función que determina si la columna es Fixed o no al darle click
  2. procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button:TMouseButton; Shift: TShiftState; X, Y: Integer);
  3. var
  4. ACol, ARow: Integer;
  5. begin
  6. StringGrid1.MouseToCell(x, y, ACol, ARow);
  7. bColumnaFixed := ACol <= StringGrid1.FixedCols-1;// bColumnaFixed <-- esta variable declarándola como global puede servirte ya en elvento DobleClick del StringGrid
  8.  
  9. end;

Saludox ! :)


  • 0

#19 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 16 abril 2015 - 02:00

Me da error en esta linea al compilar, la variable BcolumnaFixed la he declarado integer en public:

 

bColumnaFixed :=  ACol <= StringGrid1.FixedCols-1;

 

En cuanto a egostar eso me parece a mi que el error viene del evento Onclick, pero este evento lo unico que me hace es volcar los datos a TextBox de la fila seleccionada con el raton con un click, ya que me da la fila en la variable Arow.

 

Un pena no poder solucionarlo porque estoy atorado y sin motivación por no poder resolver el problema con el stringGrid1.

 

saludos.


  • 0

#20 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 16 abril 2015 - 02:09

He conseguido compilar, pero tampoco lo hace correctamente Fernareth, hace igual que antes.
 
Mirar este es mi selectCell, como he dicho vuelca a un textbox la información de la fila entera clickeada y se pone en azul al mismo tiempo la fila.
 
 

delphi
  1. procedure TForm1.StringGrid1SelectCell(Sender: TObject; aCol, aRow: Integer;
  2.   var CanSelect: Boolean);
  3. var
  4.   Rect : TRect;
  5. begin
  6.    
  7.       // Para poner todo la fila seleccionada TstringRid1 en Options.-<goRowSelect=TRUE.
  8.       Edit1.text:=StringGrid1.Cells[0,aRow];
  9.       Edit2.text:=StringGrid1.Cells[1,aRow];
  10.       Edit3.text:=StringGrid1.Cells[2,aRow];
  11.       Edit4.text:=StringGrid1.Cells[3,aRow];
  12.       Edit5.text:=StringGrid1.Cells[4,aRow];
  13.  
  14. end;

 
 
y el procedure dobleclick del ratón al pulsar la fila seleccionada.
 
 
 

delphi
  1. procedure TForm1.StringGrid1DblClick(Sender: TObject); 
  2.   var form2: TForm2;
  3.   begin
  4.        ShowMessage('La fila seleccionada con dobleclick es: '+inttostr(StringGrid1.row));
  5.        ShowMessage('La columna seleccionada con dobleclick es: '+inttostr(StringGrid1.col));
  6.       if stringGrid1.row > 0 then
  7.       begin
  8.           form2 := TForm2.Create(Self);
  9.           Form2.show();
  10.       end;
  11. end;


  • 0




IP.Board spam blocked by CleanTalk.