FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Canvas Does Not Allow Drawing
Por que me aparece este mensaje cuando tengo determinadas aplicaciones abiretas al mismo tiempo, si ejecuto solo mi aplicacion no tengo problema pero si tengo abierto el Kazaa me aparece este mensaje
|
#2
|
|||
|
|||
¿Sobre qué versión de Windows trabajas?.
Este error se lanza únicamente cuando un objeto TCanvas no puede crear un Handle sobre el que dibujar. En otras palabras, si tienes los recursos del sistema bajo mínimos es muy probable que Windows no permita asignar más Handles, y cuando un objeto que necesita dibujarse a través de Un TCanvas lo solicita, Windows se lo deniega, de ahí ese error. Esto es más común en un sistema Win95 o Win98; en Win2000 los recursos del GDI tienen un límite bastante mayor. A mí me ha aparecido bastantes veces este error bajo Win98 teniendo abierto el IDE de Delphi con varios formularios que contiene gran cantidad de componentes gráficos; si ejecuto sin cerrar el IDE o sin cerrar dichos formularios, los recursos disminuyen de lo lindo. Habría que ver cuántos recursos GDI consume esa otra aplicación, el Kazaa que comentas, cuando digo recursos GDI me refiero a Cursores, Bitmaps, Fuentes etc... No lo vas a solucionar metiendo más RAM, pues es un límite que tiene el sistema operativo.
__________________
Guía de Estilo |
#3
|
|||
|
|||
Estoy trabajando con Windows 98, pero lo raro es que cambie de maquina y me empezo a suceder, antes tenia menos memoria y una maquina mas lenta y no me pasaba, no hay forma de cambiar esa configuracion en Win98?
|
#4
|
|||
|
|||
Quizás los programas que tenías en la máquina vieja no consumían tantos recursos GDI. Ya digo que es algo propio del SO, y creo que es intocable, no creo que se pueda ajustar esos límites desde el registro ni nada similar, sería un riesgo para Windows.
__________________
Guía de Estilo |
#5
|
||||
|
||||
Agrego que es un error MUY COMÚN cuando escasean los recursos, y por eso te ha pasado cuando empezaste a ejecutar tu aplicación en otro equipo, que seguramente tiene una configuración diferente al equipo donde desarrollaste la aplicación.
Este error, como dice Andrés, sucede cuando TCanvas no puede crear un Handle, y esto sucede cuando Windows le "niega" la creación del nuevo Handle para ese canvas porque llegó al tope de los recursos. Te recomiendo leer este hilo, donde hablo de como "ahorrar" recursos en aplicaciones grandes: http://www.clubdelphi.com/foros/show...=&threadid=253 Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#6
|
|||
|
|||
Puede ser que el problema sea porque en el timage tengo archivos jpg???? antes tenia bmp y no me daba error, lo cambie a jpg para "achicar" el ejecutable, tal vez sea eso????
Me pasa lo mismo en una pequeña aplicación!!! |
#7
|
||||
|
||||
Te en cuenta que si trabajas con Jpegs, achicarás tu aplicación en recursos pero incrementarás la cantidad de código, pues tienes que introducir todos los algoritmos de Jpegs. Si los bitmaps son pequeños yo los dejaría como bitmaps.
Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#8
|
|||
|
|||
Vuelvo al foro porque este tema me tiene bastante confundido, agradezco y entiendo vuestras explicaciones pero sospecho que algo tiene que ver mi aplicacion, pues me pasa en varias pc's cuando ejecuto mi aplicacion, no siempre pero si a veces, y el factor comun es MI APLICACION ; puede ser algo en la forma de pintar las ventanas?, también tengo unos DBGRIDS con codigo en el evento "DrawColumnCell", puede ser algo de eso?
Gracias |
#9
|
|||
|
|||
Cita:
__________________
Guía de Estilo |
#10
|
|||
|
|||
El codigo es algo como esto:
private { Private declarations } UnColor:TColor; procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if DataCol=0 then if Table1Size.AsInteger>10 then UnColor:=clRed else UnColor:=clBlack; with (Sender As TDBGrid).Canvas do begin Font.Color:=UnColor; FillRect(Rect); TextOut(Rect.Left, Rect.Top, Column.Field.AsString); end; end; |
#11
|
|||
|
|||
Hola:
En el código que mencionas, resulta evidente que no puede haber una pérdida de memoria/recursos. Mira si utilizas componentes de terceros que pudieran causar dicho consumo exagerado y ten en cuenta que no tiene por qué haber un fallo de programación (el no liberar los recursos u objetos que los consuman) para que los recursos caigan tan bajo, eso sería si al cerrar la aplicación no se restituyeran, simplemente si tu aplicación hace un uso intensivo de los mismos, ya puede ser causa de el error que te sucede. La filosofía del programa también influye, no es lo mismo que muestres formularios bajo demanda y los destruyas cuando ya no hacen falta, que por ejemplo muestres un form principal con tropecientos controles, por ejemplo divididos en un TabbedBook. Mira también de utilizar TImagesList para concentrar las imágenes en un sólo sitio, en vez de asignar Glyphs a diestro y siniestro (cada uno es un Bitmap diferente) si te es posible. Bueno, son algunas ideas ... Saludos
__________________
Guía de Estilo |
|
|
|