PDA

Ver la Versión Completa : Como añadir un combo en un string grid?


burasu
07-05-2003, 19:21:15
Hola amigos, tengo el código para que aparezca un componente combo en la celda que pulse dentro de un componente String Grid.

Mi problema está en que al pulsar en la celda, el componente no se pinta, pero si pulso F4 una vez pulsada dicha celda, si se ve como se despliega el combo dentro de dicha celda y actua como yo quisiera.

Con estas pistas :p alguien me puede decir en que fallo o que se me ha olvidado?¿?¿

Gracias de antemano :D :D :D :D

marcoszorrilla
07-05-2003, 21:41:58
Yo también tengo un código que pinta un Combo dentro de una stringGrid y funciona, si quieres lo cuelgo de este hilo a la noche cuando llegue a casa, 23H más menos.

En tu caso como no publicas el código, es imposible que se te pueda ayudar, ya que al no ver el código dificilmente se puede deducir en donde está el error.

Un Saludo.

burasu
08-05-2003, 09:25:56
Aquí pongo el código:

{/* INSERTAMOS LAS DIFERENTES IMPRESORAS INSTALADAS EN EL EQUIPO DENTRO DE
LA REJILLA. */}
procedure TForm_Main.FormCreate(Sender: TObject);
begin

TotalImpre := 0;

if UpperCase(ParamStr(1)) = 'S' then Caption := 'Configuración de impresoras - SURDIST'
else Caption := 'Configuración de impresoras - SURGEST';


{/* Procedemos a dibujar la rejilla de datos. */}
Configurar_Rejilla;

end;


{/* ACCIÓN DE PULSAR EL BOTÓN ACEPTAR DE LA APLICACIÓN. */}
procedure TForm_Main.bAceptarClick(Sender: TObject);
begin
{/* Inicializamos la variable que corresponde al número de impresora. */}
numImpresora := 0;

{/* Abrimos el fichero SSECFGIM.DAT y procedemos a insertar los datos en dicho
fichero. */}
AssignFile(FicheroDatos, ExtractFilePath(ParamStr(0)) + 'SSECFGIM.DAT');
ReWrite(FicheroDatos);
Append(FicheroDatos);

{/* Procedimiento encargado de configurar los diferentes parametros de las
impresoras existentes en la aplicacion. */}
Configura_Impresora;
{/* Procedimiento encargado de configurar los diferentes visores según halla
elegido el usuario. */}
Configura_Visores;

{/* Cerramos el fichero grabando la configuración y seguidamente cerramos
la aplicación. */}
CloseFile(FicheroDatos);
Close;
end;


{/* PROCEDIMIENTO CON EL QUE COMPROBAMOS QUE VISORES ESTÁN SELECCIONADOS Y DE
ESTOS ULTIMOS LOCALIZAMOS LA RUTA DONDE ESTÁN DICHOS FICHEROS. */}
procedure TForm_Main.Configura_Visores;
var
nImpre : String;
begin

{/* EDITOR DE MS-DOS */}
if ckDOS.Checked then begin
Inc(numImpresora); {/* Aumentamos el contador de la impresora. */}
nImpre := IntToStr(numImpresora);
{/* Buscamos la ruta del fichero dentro de la carpeta Windows. */}
Ruta := RutaWindows('EDIT.COM');
{/* Si la ruta devuelve algún valor, grabamos dicha ruta en el fichero,
si no, omitimos dicha línea como si el usuario no la hubiera marcado. */}
if Ruta <> '' then
GrabarRegistro(nImpre,'Editor de MS-DOS','Pantalla',Ruta + ' $$$',
'66',ObtenerVarEntorno('MACHINE'),'','','','','');
end;

{/* BLOC DE NOTAS */}
if ckNotepad.Checked then begin
Inc(numImpresora); {/* Aumentamos el contador de la impresora. */}
nImpre := IntToStr(numImpresora);
{/* Buscamos la ruta del fichero dentro de la carpeta de Windows */}
Ruta := RutaWindows('NOTEPAD.EXE');
{/* Si la ruta devuelve algún valor, grabamos dicha ruta en el fichero,
si no, omitimos dicha línea como si el usuario no la hubiera marcado. */}
if Ruta <> '' then
GrabarRegistro(nImpre,'Bloc de Notas','Pantalla',Ruta + ' $$$',
'66',ObtenerVarEntorno('MACHINE'),'','','','','');
end;

{/* VISOR SUR */}
if ckSur.Checked then begin
Inc(numImpresora); {/* Aumentamos el contador de la impresora. */}
nImpre := IntToStr(numImpresora);
{/* Buscamos la ruta del fichero dentro de la ruta que indica la variable
de entorno TRANSDIR. */}
Ruta := RastreaDir('VISOR.EXE');
{/* Si la ruta devuelve algún valor, grabamos dicha ruta en el fichero,
si no, omitimos dicha línea como si el usuario no la hubiera marcado. */}
if Ruta <> '' then
GrabarRegistro(nImpre,'Visor Sur','Pantalla',Ruta + ' $$$',
'66',ObtenerVarEntorno('MACHINE'),'','','','','');
end;

{/* VISOR MULTIBASE */}
if ckMultibase.Checked then begin
Inc(numImpresora); {/* Aumentamos el contador de la impresora. */}
nImpre := IntToStr(numImpresora);
{/* Grabamos dicho registro dentro del fichero. */}
GrabarRegistro(nImpre,'Pantalla Multibase','Pantalla','',
'66',ObtenerVarEntorno('MACHINE'),'','','','','');
end;
end;

{/* PROCEDIMIENTO SENCILLO QUE SIMPLEMENTE GRABA EN EL FICHERO LOS DATOS
RECIBIDOS APLICANDOLES UN CIERTO FORMATEO Y ORDEN. */}
procedure TForm_Main.GrabarRegistro(Var1,Var2,Var3,Var4,Var5,Var6,
Var7,Var8,Var9,Var10,Var11 : String);
begin

WriteLn(FicheroDatos, Var1 + '|' + Var2 + '|' + Var3 + '|' + Var4 + '|' +
Var5 + '|' + Var6 + '|' + Var7 + '|' + Var8 + '|' +
Var9 + '|' + Var10 + '|' + Var11);

end;


procedure TForm_Main.GridLPTSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
var
R : TRect;
begin

{/* En caso que la columna seleccionada sea la nº 3 entonces ponemos la rejilla
en modo de edición. */}
if ((ACol = 3) and (ARow <> 0)) then begin
LineaAnt := ARow;
ValorAnt := GridLPT.Cells[3,ARow];
GridLPT.Options := [goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine,
goRowSizing,goColSizing,goEditing];
end
else begin
GridLPT.Options := [goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine,
goRowSizing,goColSizing,goEditing];
end;

{/* Proceso para mostrar dentro de la rejilla un componente Combo. */}
if ((ACol = 4) and (ARow <> 0)) then begin
CkGrafica.Visible := False; {/* Quitamos el otro componente. */}
{/* Tamaño y posición del ComboBox para llenar la celdilla. */}
R := GridLPT.CellRect(ACol, ARow);
R.Left := R.Left + GridLPT.Left;
R.Right := R.Right + GridLPT.Left;
R.Top := R.Top + GridLPT.Top;
{/* Mostramos el ComboBox. */}
with ComboTipo do begin
Left := R.Left + 1;
Top := R.Top + 1;
Width := (R.Right + 1) - R.Left;
Height := (R.Bottom + 1) - R.Top;
Style := csDropDown;
ItemIndex := Items.IndexOf(GridLPT.Cells[ACol, ARow]);
Visible := True;
SetFocus;
end;
end;

{/* Proceso para mostrar dentro de la rejilla un componente Check. */}
if ((ACol = 5) and (ARow <> 0)) then begin
ComboTipo.Visible := False; {/* Quitamos el otro componente. */}
{/* Tamaño y posición del ComboBox para llenar la celdilla. */}
R := GridLPT.CellRect(ACol, ARow);
R.Left := R.Left + GridLPT.Left;
R.Right := R.Right + GridLPT.Left;
R.Top := R.Top + GridLPT.Top;
{/* Mostramos el ComboBox. */}
with CkGrafica do begin
Left := R.Left + 3;
Top := R.Top + 3;
Width := 13;
Height := 17;
{/* Comprobamos que valor está incluido dentro de la celda. Si el valor es
'Sí' marcamos el check, y si es 'No' no lo checkeamos. */}
if GridLPT.Cells[ACol, ARow] = 'Sí' then Checked := True
else Checked := False;
Visible := True;
SetFocus;
end;
end;

if (ACol <> 5) and (ACol <> 4) then begin
CkGrafica.Visible := False;
ComboTipo.Visible := False;
end;

Application.ProcessMessages;
CanSelect := True;
end;


{/* Procedimiento con el que conseguimos que se introduzca dentro de la rejilla
el valor seleccionado en el Combo. */}
procedure TForm_Main.ComboTipoChange(Sender: TObject);
var
intRow, Opcion : Integer;
Anterior : String;
begin
inherited;
{/* Obtenemos la selección del Combo y la colocamos en la rejilla. */}
with ComboTipo do begin
intRow := GridLPT.Row;
Anterior := GridLPT.Cells[4, intRow];
if (GridLPT.Col = 4) then
GridLPT.Cells[4, intRow] := Items[ItemIndex]
else
GridLPT.Cells[GridLPT.Col, intRow] := Items[ItemIndex];
Visible := False;
end;

{/* Si la opción que pone en pantalla es Matricial, mostramos una ventana
que solicite al usuario si desea que la impresora tenga modo gráfico o no. */}
if (GridLPT.Cells[4, intRow] = 'Matricial') and
(GridLPT.Cells[2, intRow] = 'PRINTMAN') then begin
Opcion := MessageDlg('¿Desea que esta impresora use el modo gráfico?',
mtConfirmation, mbYesNoCancel, 0);
case Opcion of
2: GridLPT.Cells[4, intRow] := Anterior;
6: GridLPT.Cells[5, intRow] := 'Sí';
7: GridLPT.Cells[5, intRow] := 'No';
end;
end;

GridLPT.SetFocus;
end;

procedure TForm_Main.CkGraficaClick(Sender: TObject);
var intRow : Integer;
begin
inherited;
{/* Obtenemos la opción del Check y lo colocamos en la rejilla. */}
with CkGrafica do begin
intRow := GridLPT.Row;
if (GridLPT.Col = 5) then begin
if Checked then GridLPT.Cells[5, intRow] := 'Sí'
else GridLPT.Cells[5, intRow] := 'No';
end;
Visible := False;
end;
GridLPT.SetFocus;
end;

procedure TForm_Main.GridLPTDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
const
AlignFlags : array [TAlignment] of Integer = (DT_LEFT or DT_VCENTER or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX,
DT_RIGHT or DT_VCENTER or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX,
DT_CENTER or DT_VCENTER or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX);
var
s : String;
begin

inherited;
with Rect do begin
Left := Left + 2;
Top := Top + 2;
Right := Right - 5;
end;
s := GridLPT.Cells[ACol, ARow];
if (ARow = 0) and (ACol < GridLPT.ColCount) then begin
GridLPT.Canvas.Font.Style := GridLPT.Canvas.Font.Style + [fsBold];
GridLPT.Canvas.Brush.Color := GridLPT.FixedColor;
GridLPT.Canvas.FillRect(Rect);
DrawText(GridLPT.Canvas.Handle, pChar(s), Length(s), Rect, AlignFlags[taCenter]);
end
else if (ACol = 0) and (ARow > 0) and (ARow < GridLPT.ColCount) then begin
GridLPT.Canvas.FillRect(Rect);
DrawText(GridLPT.Canvas.Handle, pChar(s), Length(s), Rect, AlignFlags[taRightJustify]);
end;

end;

He puesto el código que creo puede interesar, si ves tambien pongo un check y en este caso si se muestra cuando pulos la celda.

Espero te pueda ayudar para poder ayudarme. Gracias