PDA

Ver la Versión Completa : Crear DateTimePickerd en TStringGrid


GerTorresM
25-05-2018, 19:13:35
Hola a tod@s

El tema que me ocupa hoy es el siguiente, quiero meter algunos de los datos de una consluta en el stringGrid, asì mismo en una columna del mismo necesito imprementar un TDateTimePicker y en la siguiente en check list, a partir de los valores del TimeDatePickerd desarrollar una nueva actividad


Agradezco de antemano el tiempo

duilioisola
27-05-2018, 23:50:30
Recuerdo haber hecho algo parecido.
La idea general es tener el componente creado y con la propiedad Visible = False.
Al moverte por las celdas vas poniendo la propiedad top, left y width, según corresponda para que quepa en la celda.
Si la celda pertenece a una columna que contiene fechas, haces visible el componente, inicializándolo con la fecha de la celda.
En el OnChange del componente actualizas la fecha de la celda.

Recuerdo que lo saqué de una web, pero no he podido encontrarla... hay ejemplos con TCheckbox...

Para que puedas empezar:
https://www.tek-tips.com/viewthread.cfm?qid=945593

Neftali [Germán.Estévez]
28-05-2018, 10:00:41
Aquí en el foros tienes algún hilo hablando del mismo problema (en este que te adjunto más adelante, en concreto con un TEdit), pero posiblemente el procedimiento a implementar sea el mismo si cambias el tipo de control.


https://www.clubdelphi.com/foros/showthread.php?t=13862

duilioisola
28-05-2018, 13:29:07
Este es un ejemplo:

Tengo un StringGrid con varias filas y columnas (5x5 en mi ejemplo).
La columna 3 contiene fechas
Si entro en la columna 3 muestro un DateTimePicker para pedir la fecha de esa celda.
Al modificar el DateTimePicker se modifica el valor de la celda



type
TFMPruebas = class(TForm)
[...]
sgPrueba: TStringGrid;
dtpPrueba: TDateTimePicker;
[...]
procedure sgPruebaSelectCell(Sender: TObject; ACol, ARow: integer; var CanSelect: boolean);
procedure dtpPruebaChange(Sender: TObject);
private
{ Private declarations }
// En la clase declaro estas variables en la parte privada
ColumnaSeleccionada : integer;
FilaSeleccionada : integer;
[...]
end;

procedure TFMPruebas.FormCreate(Sender: TObject);
begin
inherited;
// Inicialmente el componente debe estar invisible
dtpPrueba.Visible := False;
[...]
end;

procedure TFMPruebas.sgPruebaSelectCell(Sender: TObject; ACol, ARow: integer; var CanSelect: boolean);
var
r : TRect;
begin
// Posicion de la columna seleccionada en el StringGrid
r := sgPrueba.CellRect(ACol, ARow);

with dtpPrueba do
begin
// Guardo la fila-columna en la que estoy
FilaSeleccionada := ARow;
ColumnaSeleccionada := ACol;

// Si estoy en la columna que contiene fechas, hago visible el DateTimePicker
if (ACol = 3) then
begin
Left := sgPrueba.Left + sgPrueba.CellRect(ACol, ARow).Left + 2;
Top := sgPrueba.Top + r.Top + 2;
Width := r.Right - r.Left - 2;
Height := r.Bottom - r.Top;

Visible := True;
// Trato de convertir el texto de la celda en fecha. Si no puedo, utilizo la fecha de hoy
try
Date := StrToDate(sgPrueba.Cells[ACol, ARow])
except
Date := Today;
end;
end
else
Visible := False;
end;
end;

procedure TFMPruebas.dtpPruebaChange(Sender: TObject);
begin
// Modifico el valor de la celda, con el texto de la fecha
sgPrueba.Cells[ColumnaSeleccionada, FilaSeleccionada] := DateToStr(dtpPrueba.Date);
end;