PDA

Ver la Versión Completa : Problema con StringGrid y ComboBox en fsMDIChild


ramonibk
17-05-2012, 08:31:54
Buenos dias.

el problema que hoy os planteo es el siguiente.

tengo un form con un StringGrid y un ComboBox. en el evento DrawCell inserto el codigo.
var
R: TRect;
begin

if (gdSelected in State)and(ACol=1) Then
with ComboBox1 do
begin
ComboBox1.Visible := True;
ComboBox1.ItemIndex := -1;
BringToFront;
CopyRect(R, Rect);
R.TopLeft := Form1.ScreenToClient(StringGrid1.ClientToScreen(R.TopLeft));
R.BottomRight := Form1.ScreenToClient(StringGrid1.ClientToScreen(R.BottomRight));
SetBounds(R.Left, R.Top, R.Right-R.Left, R.Bottom-R.Top);
ComboBox1.SetFocus;
end;
if ACol <> 1 Then
Begin
ComboBox1.Visible := False;
end;
Con lo que consigo que cuando me posicione en la celda definida en mi caso las que corresponden a la columna 1.

esto funciona correctamente hasta.........................................

he echo que mi Form sea del tipo fsMDIChild mientras que el form se crea en el inicio de la aplicación todo bien pero se el form se crea a posterior a trabes de un botón.
TForm1.Create(Self)
hay es donde empiezan los problemas.
ACCESO VIOLATION

Y ya no se por donde meterle mano al tema.
agradecería ayuda.

afxe
17-05-2012, 12:52:16
El problema que tienes es que "Form1" no existe... podrías hacer Form1 := TForm1.Create(Self); y se te quitaría el problema, pero comentas que estás en entorno MDI, lo cual quiere decir que existe la posibilidad de varias instancias del objeto TForm1 a la vez, así que es mala idea que uses "Form1" dentro del evento OnDrawCell. Yo particularmente lo cambiaría por "Self.":

R.TopLeft := Self.ScreenToClient(StringGrid1.ClientToScreen(R.TopLeft));
R.BottomRight := Self.ScreenToClient(StringGrid1.ClientToScreen(R.BottomRight));


Nunca te acostarás sin saber una cosa más, así que si esto te ha ayudado... ala, a dormir.

ramonibk
17-05-2012, 16:00:56
Muchas gracias Afxe efectivamente ese era el pronblema.
Ya hoy puedo dormir jejejejeje

De todas maneras es lo que tiene los que aprendemos a "pogramar" a base de tecla que cometemos los fallos mas simples.

De nuevo gracias y un saludo.