2009-10-12 10 views
5

Si prega di dare un'occhiata a questo screenshotImplementazione di un controllo "pannello tag" in Delphi?

alt text http://www.maclife.com/files/u18/Yep3-big.jpg

Credo che queste sono le caratteristiche principali di un tale 'pannello di tag':

1) Ogni tag sul pannello è un controllo stand-alone e può fare clic su

2) Ritorno a capo automatico quando non c'è spazio sufficiente per mostrare il tag successivo nella riga corrente.

3) Il bordo del rettangolo con angoli arrotondati per ogni tag è una funzionalità piacevole.

Voglio implementare la funzione simile in Delphi, Esiste un controllo esistente per farlo? In caso contrario, qual è il modo migliore per implementare tale controllo?

Grazie.

+0

Un altro esempio di un "pannello di tag": http://www.macgenealogy.org/ images/screen/yep-list.jpg Puoi controllare la sezione dei tag sulla destra. –

risposta

3

Ogni tag cliccabile non deve necessariamente essere il proprio controllo. Deve solo essere una regione in cui è possibile rilevare il clic.

Supponi di rappresentare ciascuna area come Windows region. È possibile capire in che misura ciascuno dovrebbe basarsi sul suo testo con la funzione TCanvas.TextExtent. Quindi creare una regione con una funzione come CreateRectRgn. Per gli angoli arrotondati, prova invece a CreateRoundRectRgn. È possibile verificare gli eventi del mouse in ogni area con la funzione PtInRegion. Puoi dipingere bordi intorno a loro con FrameRgn. L'ultimo ostacolo è disegnarli sullo schermo in modo che si adattino tutti. Stai creando le regioni e conosci la loro larghezza, quindi assegna i tag a una riga finché non esaurisci lo spazio, quindi avvia la riga successiva.

+0

grazie per il suggerimento Rob. Hai qualche consiglio se voglio che questi tag possano essere riposizionati tramite drag and drop? Ad esempio, trascinare il secondo tag sulla riga 2 e rilasciare all'inizio della riga 1. Grazie. –

+0

Rileva il mouse-down e gli eventi di spostamento del mouse sufficienti per distinguere tra un trascinamento e un clic, quindi chiama 'SetCapture' per passare alla modalità" trascina ". Gestisci gli eventi di spostamento del mouse mentre aspetti un evento di mouse-up, a quel punto puoi riordinare i tag. (Tutta questa domanda è una domanda panoramica. Se hai domande specifiche su qualcosa, per favore inizia una * nuova * domanda, in cui le persone possono rispondere senza dover coprire una mezza dozzina di problemi diversi in un'unica risposta.) –

7

Quando si utilizza una versione di Delphi recente, utilizzare un TFlowPanel e alcuni controlli appropriati per i tag. Un semplice TButton o una TLinkLabel dovrebbe fare per quello.

+0

Grazie Uwe, purtroppo , Io uso D7. L'aggiornamento non è attualmente un'opzione. –

1

Esistono due possibili soluzioni per l'allineamento personalizzato in Delphi 7. È possibile creare il proprio pannello di flusso derivando da TCustomPanel e sovrascrivendo il metodo AlignControls(), oppure è possibile impostare l'allineamento su alCustom e gestire l'evento OnAlignPosition.

Suppongo che sarei andato per l'opzione derivata TCustomPanel. TFlowPanel nel modulo Delphi 2007 usa questa opzione, devo ammettere, tuttavia, che non ho mai provato nessuno di me ...

+0

grazie per il suggerimento, Vegar :) –

Problemi correlati