Casa
Top.Mail.Ru Yandeks.Metrika
Foro: "Principal";
Archivo actual: 2002.01.08;
Descargar: [xml.tar.bz2];

abajo

El componente no está dibujado, y eso es todo ... Encontrar ramas similares


Aleksandr   (2001-12-18 13:03) [0]

Estimados colegas!
Me llevó a crear un componente. Creado por el desove de TGraphicControl. Pongo en el formulario: todo está en orden, es visible, pero no está dibujado, y eso es todo ... El código es

tipo
TWayTree = clase (TGraphicControl)
privada
...
protegido
procedimiento de pintura;
público
constructor Crear (AOwner: TComponent);
publicado
...
propiedad Color por defecto clWhite;
propiedad Visible por defecto verdadero;
fin;

procedimiento de registro;

implementación

procedimiento TWayTree.Paint;
var
ARect: TRect;
comenzar
Heredado
Canvas.Brush.Color: = Color;
ARect.Left: = Izquierda;
ARect.Top :=Top;
ARect.Bottom: = Top + Height;
ARect.Right: = Left + Width;
Canvas.FillRect (ARect)
fin;

constructor TWayTree.Create;
comenzar
Creación heredada (AOwner);
...
fin;

procedimiento de registro;
comenzar
RegistrarComponentes ("WayTrees", [TWayTree])
fin;

fin.

Además, cuando todavía estoy intentando agregar las propiedades de FPen y FBrush (para acceso por separado en el tiempo de diseño):

TWayTree = clase (TGraphicControl)
privada
FPen: TPen;
FBrush: TBrush;
procedimiento RePaintRequest (Sender: TObject);
procedimiento SetBrush (Valor: TBrush);
procedimiento SetPen (Valor: TPen);
protegido
procedimiento de pintura;
público
constructor Crear (AOwner: TComponent);
destructor destruye;
publicado
propiedad Color por defecto clWhite;
propiedad visible;
propiedad Brush: TBrush lee FBrush escribe SetBrush;
propiedad Pen: TPen read FPen write SetPen;
fin;

procedimiento de registro;

implementación

procedimiento TWayTree.Paint;
var
ARect: TRect;
comenzar
Heredado
Canvas.Pen: = FPen;
Canvas.Brush: = FBrush;
Canvas.Brush.Color: = Color;
ARect.Left: = Izquierda;
ARect.Top :=Top;
ARect.Bottom: = Top + Height;
ARect.Right: = Left + Width;
Canvas.FillRect (ARect);
Canvas.TextOut (ARect.Left, ARect.Top, "AAA");
fin;

destructor TWayTree.Destroy;
comenzar
FPen.Free;
FBrush.Free;
heredado destruye
fin;

constructor TWayTree.Create;
comenzar
Creación heredada (AOwner);
FPen: = TPen.Create;
FBrush: = TBrush.Create;
FPen.OnChange: = RepaintRequest;
FBrush.OnChange: = RepaintRequest
fin;

procedimiento TWayTree.SetBrush;
comenzar
si Valor = nil entonces
Salida
FBrush.Assign (Valor);
Invalidar
fin;

procedimiento TWayTree.SetPen;
comenzar
si Valor = nil entonces
Salida
FPen.Assign (Valor);
Invalidar
fin;

procedimiento TWayTree.RePaintRequest;
comenzar
Invalidar
fin;

procedimiento de registro;
comenzar
RegisterComponents ("WayTrees", [TWayTree]);
fin;

fin.
El componente jura cuando se inserta en una forma que no puede configurar el lápiz en cero. Aparecen el lápiz y el pincel en el Inspector, pero cuando hago clic en +, la nifiga no se cae, cuando redimensiono los componentes, el mismo error ... ¿Qué estoy haciendo mal aquí?



csf   (2001-12-18 13:09) [1]

Reiniciar Delphi, dicen, ayuda.
Про almacenados todavía puedes leer ...



Aleksandr   (2001-12-18 13:11) [2]

Lo siento, tengo que ir al vertedero ... Descubrí que olvidé anular el constructor opuesto al constructor con el destructor para dibujar ... Me pregunto cómo se puede conectar una Barra de desplazamiento vertical a este componente ...



csf   (2001-12-18 13:19) [3]

... sería bueno consultar con Paint FPen & FBrush para nil ...



Юрий Зотов   (2001-12-18 14:30) [4]

> csf

1. > Reiniciar Delphi, dicen, ayuda.
Consejos valiosos.

2. > Todavía puedes leer sobre el almacenado ...
Usted puede Sólo para sabzh no tiene nada que ver.

3. > ... sería bueno consultar con Paint FPen & FBrush para nil ...
Por que Se crean en el constructor de componentes. Nil no puede estar allí.

Total: escribiste frases 3 y todas las 3, disculpa, sin sentido. ¿Valió la pena escribir? ¿Vale la pena en absoluto responder preguntas cuyo tema, para decirlo suavemente, no está muy familiarizado?


> Aleksandr

Ya ha superado la anulación, pero eso no es todo, tiene un doble redibujado:

procedimiento TWayTree.SetBrush;
comenzar
if Valor = nil entonces // Esto es innecesario e incluso dañino: enmascara los errores del usuario
Salida
FBrush.Assign (Valor); // Genere FBrush.OnChange y llame a RePaintRequest
Invalidar // Esto es superfluo - re-redibujado
fin;

Y lo mismo en SetPen. Además, la variable ARect en Paint es completamente innecesaria: use ClientRect o Canvas.ClipRect.

Finalmente, lo principal es que sus FBrush y FPen son absolutamente inútiles, solo se están destruyendo recursos adicionales. Usa el lienzo incorporado:

publicado
propiedad Pen: TPen lee GetPen write SetPen;
...

función ... GetPen: TPen;
comenzar
Resultado: = Canvas.Pen
fin;

procedimiento ... SetPen (const Valor: TPen);
comenzar
Canvas.Pen.Assign (Valor)
fin;

Conclusión: incluso los componentes más simples deben analizarse con más cuidado y más detalle.



Aleksandr   (2001-12-18 15:50) [5]

2 Yuri Zotov
Gracias por la información. Sin embargo, una referencia directa a las propiedades del lienzo causará algo que no será el "estándar" de forma predeterminada: siempre seguirá dibujando en el color que se usó por última vez. Y, en consecuencia, no se puede plantar nada en OnChange (se producirá un bucle elemental). Al establecer el color del lienzo, OnChange causa un redibujado y, en el redibujado, el color del lienzo vuelve a cambiar.
Solo hay una pregunta en la agenda: ¿cómo empaquetar en el componente TScrollBar? Algo que no puedo hacer doble herencia - de TGraphicControl y de TScrollBar ...



DieHard   (2001-12-18 16:01) [6]

La doble herencia no funcionará.
Intenta heredar de TScrollBox.



MBo   (2001-12-18 16:02) [7]

No hay doble herencia.
Tal vez heredar de TWinControl?



Polevi   (2001-12-18 16:19) [8]

TCustomControl



Aleksandr   (2001-12-18 16:19) [9]

Hmm ... bueno, dejemos esto por ahora ... ¿Cómo evitar el parpadeo constante de los componentes al cambiar el tamaño de un formulario?



panov   (2001-12-18 16:31) [10]

> Aleksandr © (18.12.01 16: 19)
Intenta configurar Habilitado: = Falso antes de redimensionar



Юрий Зотов   (2001-12-18 17:25) [11]

> Aleksandr © (18.12.01 15: 50)

> siempre continuará dibujando en el color que se usó por última vez.

Lo que se requiere.


> Y, en consecuencia, nada se puede plantar en OnChange

Y no lo hagas. Su método de pintura se llamará automáticamente, y no se requiere nada más.

> habrá un bucle elemental - configurando el color del lienzo
> causa OnChange, causa redibujado, y al redibujar nuevamente
> Cambios en el color del lienzo.

Primero, usted mismo confirma que el cambio de las propiedades del lienzo llama automáticamente a su método Paint. Esto significa que tiene que estar de acuerdo con el punto anterior: no necesita ningún controlador OnChange (los controladores OnChange solo dan un redibujado adicional; de ahí el parpadeo adicional).

En segundo lugar, en el redibujado NO es necesario cambiar las propiedades del lienzo. Por que Después de todo, si vincula las propiedades del componente con las propiedades del lienzo, entonces, cuando llame al método Paint, estas propiedades del lienzo YA se establecerán como sea necesario. Dibuja con ellos sin cambiar nada. Y entonces no habrá bucles.

En general, te aconsejo que lo intentes - ver por ti mismo. Creo que el parpadeo se reducirá significativamente.

A continuación, sobre el parpadeo y la barra de desplazamiento: escuche los consejos de Polevi. TCustomControl es una ventana. Los ScrollBars se insertan allí simplemente configurando los estilos WS_HSCROLL / WS_VSCROLL en CreateParams, y puede reducir el parpadeo configurando la propiedad DoubleBuffered.



Páginas: 1 rama entera

Foro: "Principal";
Archivo actual: 2002.01.08;
Descargar: [xml.tar.bz2];

arriba









Memoria: 0.87 MB
Tiempo: 0.232 c
6-22301
Chino que
2001-10-10 14:45
2002.01.08
¿Esclerosis o qué?


6-22291
leviatán
2001-10-09 22:02
2002.01.08
Pregunta sobre el componente NMFTP


3-21910
Wladimir
2001-12-04 08:01
2002.01.08
¿Número de entradas en la tabla?


3-21913
SklifF
2001-12-03 19:08
2002.01.08
Columna Suma Pro


1-22087
Serg5
2001-12-19 15:14
2002.01.08
Gente, ¡una pregunta bastante fácil! Enlace al procedimiento en una palabra.





africaans albanés Arabic armenio Azerbaiyán vasco Bielorruso Bulgarian Catalán Chino (simplificado) Chino (tradicional) Croata Checo Danés Dutch Inglés Estonia filipina Finnish Francés
gallego georgiano Alemán Griego criollo haitiano hebreo hindi Húngaro islandés Indonesian irlandés Italiana Japonés Korean letón lituano macedonio Malay maltés Noruego
persa polaco Portuguese rumano Ruso Serbio Slovak Esloveno Español swahili Sueco Thai turco ucranio Urdu vietnamita galés yídish bengalí bosnio
cebuano esperanto gujarati hausa hmong igbo javanés kannada khmer lao latín maorí marathi mongol nepali punjabi somalí Tamil telugu yoruba
zulú
Английский Francés Alemán Italiano portugués Русский Español