Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Problema con StringGrid y ComboBox en fsMDIChild (https://www.clubdelphi.com/foros/showthread.php?t=78791)

ramonibk 17-05-2012 08:31:54

Problema con StringGrid y ComboBox en fsMDIChild
 
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.
Código Delphi [-]
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.
Código Delphi [-]
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.":
Código Delphi [-]
     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.


La franja horaria es GMT +2. Ahora son las 20:07:42.

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