Casa
Top.Mail.Ru Yandeks.Metrika
Fórum: "Principal";
Arquivo atual: 2002.01.08;
Download: [xml.tar.bz2];

Para baixo

O componente não é desenhado, e é isso ... Encontre agências semelhantes


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

Caros colegas!
Demorei-me a criar um componente. Criado pela geração do TGraphicControl. Eu coloquei o formulário - tudo está em ordem, é visível, mas não é desenhado, e é isso ... O código é

tipo
TWayTree = classe (TGraphicControl)
privado
...
protegido
procedimento Paint; override;
público
construtor Create (AOwner: TComponent);
publicado
...
propriedade Cor padrão clWhite;
propriedade Visible default true;
end;

registro;

implementação

procedimento TWayTree.Paint;
var
ARect: TRect;
começar
Herdado;
Canvas.Brush.Color: = cor;
ARect.Left: = Esquerda;
ARect.Top:=Top;
ARect.Bottom: = Top + Altura;
ARect.Right: = Esquerdo + Largura;
Canvas.FillRect (ARect)
end;

construtor TWayTree.Create;
começar
Inherited Create (AOwner);
...
end;

registro;
começar
RegisterComponents ("WayTrees", [TWayTree])
end;

final.

Além disso, quando ainda estou tentando adicionar as propriedades FPen e FBrush (para acesso separado no tempo de design):

TWayTree = classe (TGraphicControl)
privado
FPen: TPen;
FBrush: TBrush;
procedimento RePaintRequest (Sender: TObject);
procedimento SetBrush (Value: TBrush);
procedimento SetPen (Valor: TPen);
protegido
procedimento Paint; override;
público
construtor Create (AOwner: TComponent);
destruidor Destruir;
publicado
propriedade Cor padrão clWhite;
propriedade Visível;
propriedade Brush: TBrush ler FBrush escrever SetBrush;
propriedade Pen: TPen read FPen write SetPen;
end;

registro;

implementação

procedimento TWayTree.Paint;
var
ARect: TRect;
começar
Herdado;
Canvas.Pen: = FPen;
Canvas.Brush: = FBrush;
Canvas.Brush.Color: = cor;
ARect.Left: = Esquerda;
ARect.Top:=Top;
ARect.Bottom: = Top + Altura;
ARect.Right: = Esquerdo + Largura;
Canvas.FillRect (ARect);
Canvas.TextOut (ARect.Left, ARect.Top, "AAA");
end;

destrutor TWayTree.Destroy;
começar
FPen.Free;
FBrush.Free;
Herdado Destruir
end;

construtor TWayTree.Create;
começar
Inherited Create (AOwner);
FPen: = TPen.Create;
FBrush: = TBrush.Create;
FPen.OnChange: = RepaintRequest;
FBrush.OnChange: = RepaintRequest
end;

procedimento TWayTree.SetBrush;
começar
se Valor = nulo, então
Saída;
FBrush.Assign (valor);
Invalidar
end;

procedimento TWayTree.SetPen;
começar
se Valor = nulo, então
Saída;
FPen.Assign (Valor);
Invalidar
end;

procedimento TWayTree.RePaintRequest;
começar
Invalidar
end;

registro;
começar
RegisterComponents ("WayTrees", [TWayTree]);
end;

final.
O componente jura quando inserido em um formulário que não pode definir a pena como nula. Caneta e Pincel no Inspector aparecem, mas quando eu clico em +, o nifiga não cai, quando eu redimensiono os componentes, o mesmo erro ... O que estou fazendo errado aqui?



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

Restart Delphi, eles dizem, ajuda.
Про armazenadas você ainda pode ler ...



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

Desculpe, eu tenho que ir para o lixo ... Eu descobri que eu esqueci de substituir o construtor com o destrutor para desenhar ... Eu me pergunto como você pode conectar um ScrollBar vertical para este componente ...



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

... seria bom verificar com o Paint FPen & FBrush para nil ...



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

> csf

1. > Restart Delphi, eles dizem, ajuda.
Conselho valioso.

2. > Você ainda pode ler sobre o armazenamento ...
Você pode. Só para sabzh não tem nada para fazer.

3. > ... seria bom verificar com o Paint FPen & FBrush para ...
Por quê? Eles são criados no construtor do componente. Nil não pode estar lá.

Total: Você escreveu frases 3 e todas 3, desculpe-me, sem sentido. Valeu a pena escrever? Vale a pena responder a perguntas cujo tópico você, para dizer o mínimo, não está muito familiarizado?


> Aleksandr

Você já tratou de se sobrepor, mas isso não é tudo - você tem um redesenho duplo:

procedimento TWayTree.SetBrush;
começar
if Value = nil then // Isso é desnecessário e até prejudicial - mascara os erros do usuário
Saída;
FBrush.Assign (valor); // Gera FBrush.OnChange e chama RePaintRequest
Invalidar // Isso é supérfluo - há um redesenho repetido.
end;

E o mesmo em SetPen. Além disso, a variável ARect no Paint é completamente desnecessária - use ClientRect ou Canvas.ClipRect.

Finalmente, o principal - o FBrush e o FPen são absolutamente inúteis - apenas recursos extras estão sendo destruídos. Use a tela interna:

publicado
propriedade Pen: TPen ler GetPen escrever SetPen;
...

função ... GetPen: TPen;
começar
Resultado: = Canvas.Pen
end;

procedure ... SetPen (const Valor: TPen);
começar
Canvas.Pen.Assign (Value)
end;

Conclusão - até mesmo esses componentes mais simples precisam ser pensados ​​com mais cuidado e mais cuidado.



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

2 Yuri Zotov
Obrigado pela informação. No entanto, uma referência direta às propriedades da tela causará algo que não será o "padrão" por padrão - sempre continuará a desenhar a cor que foi usada por último. E, consequentemente, nada pode ser plantado no OnChange - um loop elementar irá ocorrer - configurar a cor da tela causa OnChange, ele causa um redesenho, e no redesenho, a cor do Canvas muda novamente.
Há apenas uma pergunta na agenda: como compactar o componente TScrollBar? Algo que não posso fazer herança dupla - do TGraphicControl e do TScrollBar ...



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

Herança dupla não funcionará.
Tente herdar do TScrollBox.



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

sem herança dupla.
talvez herdar do TWinControl?



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

TCustomControl



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

Hmm ... bem, vamos deixar isso por enquanto ... Veja como evitar a oscilação constante de componentes ao redimensionar um formulário?



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

> Aleksandr © (18.12.01 16: 19)
Tente definir Ativado: = Falso antes de redimensionar



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

> Aleksandr © (18.12.01 15: 50)

> sempre continuará a desenhar a cor que foi usada por último.

O que é requerido


> E, consequentemente, nada pode ser plantado no OnChange

E não faça isso. Seu método Paint será chamado automaticamente e nada mais é necessário.

> haverá um loop elementar - definindo a cor da tela
> faz com que o OnChange cause redesenho e, em redesenhar novamente
> Alterações de cor da tela.

Primeiro, você mesmo confirma que alterar as propriedades da tela chama automaticamente seu método Paint. Isto significa que você tem que concordar com o ponto anterior - você não precisa de nenhum manipulador OnChange (os manipuladores OnChange só dão um redesenho extra - daí a piscada extra).

Em segundo lugar, no redesenho, NÃO é necessário alterar as propriedades da tela. Por quê? Afinal, se você vincular as propriedades do componente às propriedades da tela, quando chamar o método Paint, essas propriedades da tela JÁ serão definidas conforme necessário. Desenhe com eles sem mudar nada. E então não haverá looping.

Em geral, eu aconselho você a tentar - veja por si mesmo. Eu acho que a cintilação será significativamente reduzida.

Em seguida, sobre o flicker e ScrollBar - ouça o conselho de Polevi. O TCustomControl é uma janela. ScrollBars são inseridos lá simplesmente definindo os estilos de WS_HSCROLL / WS_VSCROLL em CreateParams e você pode reduzir a tremulação, definindo a propriedade DoubleBuffered.



Страницы: 1 filial inteira

Fórum: "Principal";
Arquivo atual: 2002.01.08;
Download: [xml.tar.bz2];

em cima









Memória: 0.61 MB
Hora: 0.029 c
7-22451
Dmitri
2001-09-23 12:36
2002.01.08
Diretiva {$ I}


1-22254
facilidade
2001-12-17 13:32
2002.01.08
Arquivamento de dados


1-22080
Delphimun
2001-12-18 17:11
2002.01.08
Como carregar um cursor de um recurso e depois salvá-lo no disco?


4-22488
Arick
2001-10-31 09:20
2002.01.08
como descobrir o nome da dll carregada


1-22047
handra
2001-12-17 13:12
2002.01.08
Criação de ajuda





afrikaans albanês Arabic armênio azerbaijano basco belarusian Bulgarian catalão Chinês simplificado) Chinês tradicional) croata checo dinamarquês Dutch Inglês estoniano filipino Finnish French
Galego georgiano German grego crioulo haitiano hebraico hindi húngaro islandês Indonesian irlandês Italian Japanese Korean letão lituano macedónio Malay maltês Norwegian
persa polonês Portuguese romeno Russa sérvio Slovak esloveno espanhol swahili sueco tailandês turco ucraniano urdu vietnamita galês ídiche bengali bósnio
cebuano esperanto gujarati hausa hmong igbo javanês kannada khmer lao latino maori marata mongol Nepali punjabi somali tâmil telugu yoruba
zulu
Английский francês Alemão Italiano Португальский russo Espanhol