casa
Top.Mail.Ru Yandeks.Metrika
Forum: "Principale";
Archivio attuale: 2002.01.08;
Scarica: [xml.tar.bz2];

giù

Il componente non è disegnato, e questo è tutto ... Trova rami simili


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

Cari colleghi!
Mi ci è voluto per creare un componente. Creato da spawning da TGraphicControl. Ho messo il modulo - tutto è in ordine, è visibile, ma non è disegnato, e questo è tutto ... Il codice è

Digitare
TWayTree = class (TGraphicControl)
privato
...
protetta
procedura Paint; override;
pubblico
costruttore Create (AOwner: TComponent);
pubblicato
...
proprietà Colore predefinito clWhite;
proprietà Visible default true;
fine;

registro delle procedure;

implementazione

procedura TWayTree.Paint;
var
ARect: TRect;
iniziare
ereditato;
Canvas.Brush.Color: = Colore;
ARect.Left: = Left;
ARect.Top:=Top;
ARect.Bottom: = Top + Height;
ARect.Right: = Left + Width;
Canvas.FillRect (ARect)
fine;

costruttore TWayTree.Create;
iniziare
Inherited Create (AOwner);
...
fine;

registro delle procedure;
iniziare
RegisterComponents ("WayTrees", [TWayTree])
fine;

fine.

Inoltre, quando sto ancora cercando di aggiungere le proprietà FPen e FBrush (per l'accesso separato nei tempi di progettazione):

TWayTree = class (TGraphicControl)
privato
FPen: TPen;
FBrush: TBrush;
procedura RePaintRequest (Sender: TObject);
procedura SetBrush (Valore: TBrush);
procedura SetPen (Valore: TPen);
protetta
procedura Paint; override;
pubblico
costruttore Create (AOwner: TComponent);
distruttore Destroy;
pubblicato
proprietà Colore predefinito clWhite;
proprietà visibile;
property Brush: TBrush read FBrush write SetBrush;
property Pen: TPen read FPen write SetPen;
fine;

registro delle procedure;

implementazione

procedura TWayTree.Paint;
var
ARect: TRect;
iniziare
ereditato;
Canvas.Pen: = FPen;
Canvas.Brush: = FBrush;
Canvas.Brush.Color: = Colore;
ARect.Left: = Left;
ARect.Top:=Top;
ARect.Bottom: = Top + Height;
ARect.Right: = Left + Width;
Canvas.FillRect (ARect);
Canvas.TextOut (ARect.Left, ARect.Top, "AAA");
fine;

distruttore TWayTree.Destroy;
iniziare
FPen.Free;
FBrush.Free;
ereditato Distruggi
fine;

costruttore TWayTree.Create;
iniziare
Inherited Create (AOwner);
FPen: = TPen.Create;
FBrush: = TBrush.Create;
FPen.OnChange: = RepaintRequest;
FBrush.OnChange: = RepaintRequest
fine;

procedura TWayTree.SetBrush;
iniziare
se Valore = nullo allora
Exit;
FBrush.Assign (Value);
infirmare
fine;

procedura TWayTree.SetPen;
iniziare
se Valore = nullo allora
Exit;
FPen.Assign (Value);
infirmare
fine;

procedura TWayTree.RePaintRequest;
iniziare
infirmare
fine;

registro delle procedure;
iniziare
RegisterComponents ("WayTrees", [TWayTree]);
fine;

fine.
il componente giura quando inserito in un modulo che non può impostare la penna su zero. Penna e pennello nell'Inspector appaiono, ma quando clicco su +, la nifiga non cade, quando ridimensiono i componenti, lo stesso errore ... Che cosa sto facendo male qui?



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

Riavvia Delphi, dicono, aiuta.
Про memorizzati puoi ancora leggere ...



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

Scusate, devo andare alla discarica ... ho capito che ho dimenticato di scavalcare di fronte al costruttore con il distruttore da disegnare ... Mi chiedo come sia possibile collegare una barra di scorrimento verticale a questo componente ...



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

... sarebbe bello controllare con Paint FPen e FBrush per nil ...



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

> csf

1. > Riavvia Delphi, dicono, aiuta.
Consiglio prezioso

2. > Puoi ancora leggere sul file memorizzato ...
Puoi. Solo per sabzh non ha niente da fare.

3. > ... sarebbe bello controllare con Paint FPen e FBrush per nil ...
Perché? Sono creati nel costruttore di componenti. Nil non può essere lì.

Totale: hai scritto frasi 3 e tutto 3, scusami, sciocchezze. Valeva la pena scrivere? Vale la pena di rispondere a domande di cui non si conosce molto l'argomento, per usare un eufemismo?


> Aleksandr

Hai già avuto a che fare con l'override, ma non è tutto - hai un doppio ridisegno:

procedura TWayTree.SetBrush;
iniziare
se Value = nil then // Questo è inutile e persino dannoso - maschera gli errori dell'utente
Exit;
FBrush.Assign (Value); // Genera FBrush.OnChange e chiama RePaintRequest
Invalidate // Questo è superfluo - c'è un ripetuto ridisegno
fine;

E lo stesso in SetPen. Inoltre, la variabile ARect in Paint non è necessaria: utilizzare ClientRect o Canvas.ClipRect.

Infine, la cosa principale - il loro FBrush e FPen è assolutamente inutile - vengono distrutte solo risorse extra. Usa la tela incorporata:

pubblicato
property Pen: TPen read GetPen write SetPen;
...

funzione ... GetPen: TPen;
iniziare
Risultato: = Canvas.Pen
fine;

procedura ... SetPen (const Value: TPen);
iniziare
Canvas.Pen.Assign (Value)
fine;

Conclusione: anche i componenti più semplici devono essere pensati più attentamente e con maggiore attenzione.



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

2 Yuri Zotov
Grazie per le informazioni. Tuttavia, un riferimento diretto alle proprietà della tela causerà qualcosa che non sarà lo "standard" di default - continuerà sempre a disegnare il colore che è stato usato per ultimo. E, di conseguenza, su OnChange non si può piantare nulla: si verificherà un loop elementare - l'impostazione del colore della tela causa OnChange, provoca un ridisegno e, nel ridisegno, il colore della tela cambia di nuovo.
C'è solo una domanda all'ordine del giorno: come impacchettare il componente TScrollBar? Qualcosa che non posso fare una doppia ereditarietà: da TGraphicControl e da TScrollBar ...



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

La doppia ereditarietà non funzionerà.
Prova ad ereditare da TScrollBox.



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

nessuna doppia eredità.
forse ereditato da TWinControl?



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

TCustomControl



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

Hmm ... beh, lasciamo questo per ora ... Ecco come evitare lo sfarfallio costante dei componenti durante il ridimensionamento di un modulo?



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

> Aleksandr © (18.12.01 16: 19)
Prova a impostare Abilitato: = Falso prima di ridimensionare



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

> Aleksandr © (18.12.01 15: 50)

> continuerà sempre a disegnare il colore usato per ultimo.

Cosa è richiesto


> E, di conseguenza, nulla può essere piazzato su OnChange

E non farlo. Il tuo metodo Paint verrà chiamato automaticamente e non è richiesto nient'altro.

> ci sarà un ciclo elementare - impostando il colore della tela
> causa OnChange, causa il ridisegno e nuovamente il ridisegno
> Cambiamenti di colore della tela.

In primo luogo, tu stesso confermi che la modifica delle proprietà della tela chiama automaticamente il metodo Paint. Ciò significa che devi essere d'accordo con il punto precedente: non hai bisogno di alcun gestore di OnChange (i gestori di OnChange danno solo un ridisegno in più - da qui il lampo in più).

In secondo luogo, nel ridisegno NON è necessario modificare le proprietà della tela. Perché? Dopo tutto, se si legano le proprietà del componente alle proprietà del canvas, quando si chiama il metodo Paint, queste proprietà del canvas verranno GIÀ impostate come necessario. Disegna con loro senza cambiare nulla. E poi non ci saranno loop.

In generale, ti consiglio di provare - guarda tu stesso. Penso che lo sfarfallio sarà notevolmente ridotto.

Successivamente, riguardo allo sfarfallio e alla barra di scorrimento, ascolta il consiglio di Polevi. TCustomControl è una finestra. ScrollBars vengono inseriti lì semplicemente impostando gli stili WS_HSCROLL / WS_VSCROLL in CreateParams e puoi ridurre lo sfarfallio impostando la proprietà DoubleBuffered.



Pagine: 1 tutto il ramo

Forum: "Principale";
Archivio attuale: 2002.01.08;
Scarica: [xml.tar.bz2];

al piano di sopra









Memoria: 0.61 MB
Ora: 0.039 c
14-22415
wetnose
2001-11-12 06:42
2002.01.08
Argomenti per WinXP


4-22477
Arte
2001-10-31 12:17
2002.01.08
Come vedere tutti i processi che eseguono tutti i programmi?


1-22240
creepster
2001-12-16 19:20
2002.01.08
TButton


1-22233
Delphimun
2001-12-15 12:47
2002.01.08
Come eseguire un file nel componente Tolecontainer


14-22391
Serg5
2001-11-10 10:29
2002.01.08
Chi non è pigro, vai su http://forum.ru-board.com/, si blocca davvero, o il filtro IP, non me lo permettono.





afrikaans albanese Arabic armeno Azero basco bielorusso Bulgarian catalano Cinese (semplificato) Cinese (tradizionale) croato Ceco danese Dutch Inglese estone filippina Finnish Francese
galiziano georgiano Tedesco greco Creolo haitiano ebraico hindi ungherese islandese Indonesian irlandese Italiano Giapponese Korean lettone lituano macedone Malay maltese Norwegian
persiano polacco Portoghese rumeno Russian serbo Slovak sloveno Spagnolo swahili Swedish Thai turco ucraino Urdu vietnamita gallese yiddish bengalese bosniaco
Cebuano esperanto Gujarati Hausa Hmong Igbo giavanese kannada khmer lao latino maori marathi mongolo nepali punjabi somalo tamil telugu Yoruba
zulù
Inglese Francese tedesco italiano portoghese russo spagnolo