Largura do ComboBox
Iai galera, como é que eu faço para que a largura do combobox fique grande quando ele da o dropdown
explicando melhor
o meu combobox é deste tamanho
| COMBO |
o conteudo dele é grande
entao preciso que ele fique do mesmo tamanho e o conteudo grande
assim
| COMBO |
| item 1 |
| item 2 |
| item 3 |
Abraços
explicando melhor
o meu combobox é deste tamanho
| COMBO |
o conteudo dele é grande
entao preciso que ele fique do mesmo tamanho e o conteudo grande
assim
| COMBO |
| item 1 |
| item 2 |
| item 3 |
Abraços
Tremonti
Curtidas 0
Respostas
Massuda
23/08/2005
Este código faz o ajuste da largura do dropdown de um combobox de modo que o texto dos itens é sempre totalmente visível...A procedure não trata o caso de encontrar uma largura muito grande (por exemplo, maior que a tela)... no meu caso isso não era problema pois eu sabia a priori o que seria exibido no combobox, mas pode ser problema no seu caso.
procedure AjustarLargura(ComboBox: TComboBox); var I: Integer; TextLen: LongInt; lf: LOGFONT; f: HFONT; w: Integer; begin FillChar(lf, SizeOf(lf), 0); StrPCopy(lf.lfFaceName, ComboBox.Font.Name); lf.lfHeight := ComboBox.Font.Height; lf.lfWeight := FW_NORMAL; if fsBold in ComboBox.Font.Style then begin lf.lfWeight := lf.lfWeight or FW_BOLD; end; f := CreateFontIndirect(lf); if f <> 0 then begin try ComboBox.Canvas.Handle := GetDC(ComboBox.Handle); SelectObject(ComboBox.Canvas.Handle, f); try w := 0; for I := 0 to Pred(ComboBox.Items.Count) do begin TextLen := ComboBox.Canvas.TextWidth(ComboBox.Items[I]); if TextLen > w then begin w := TextLen; end; end; Inc(w, GetSystemMetrics(SM_CYVTHUMB) + GetSystemMetrics(SM_CXVSCROLL)); SendMessage(ComboBox.Handle, CB_SETDROPPEDWIDTH, w, 0); finally ReleaseDC(ComboBox.Handle, ComboBox.Canvas.Handle); end; finally DeleteObject(f); end; end; end;
GOSTEI 0
Marco Salles
23/08/2005
eu não testei o seu código não massuda , mas acredito que ele deve funcionar
Mas ha pouco dias atrás um dúvida parecida com esta foi lançada .. A única diferença é que ao invés de se tratar de um comboBox o problema era a respeito da Grid...
A pergunta é , pode se fazer a mesma coisa a respeito das colunas da Grid baseado nesta tua idéia :?: :?: :?:
Mas ha pouco dias atrás um dúvida parecida com esta foi lançada .. A única diferença é que ao invés de se tratar de um comboBox o problema era a respeito da Grid...
A pergunta é , pode se fazer a mesma coisa a respeito das colunas da Grid baseado nesta tua idéia :?: :?: :?:
GOSTEI 0
Massuda
23/08/2005
[quote:7a4f6ad2e3=´Marco Salles´]...pode se fazer a mesma coisa a respeito das colunas da Grid...[/quote:7a4f6ad2e3]Não lembro de que tópico você está falando, mas acho que não dá/precisa ser a mesma coisa que foi feita para o combobox... no combobox o processo é mais complicado porque o combobox não tem um canvas que pode ser manipulado diretamente pela VCL (o combobox é um controle padrão do Windows), porisso é preciso fazer alguma ´ginástica´ para obter um canvas.
No caso de um grid, se você tiver [i:7a4f6ad2e3]a priori[/i:7a4f6ad2e3] uma lista do que vai ser exibido na coluna, basta determinar o maior comprimento de texto (via Grid.Canvas.TextWidth) e fazer esse valor ser a largura da coluna (some 2 (ou 4?) para compensar as linhas do grid).
Se for um dbgrid, o problema é o tempo gasto em obter os valores das colunas para determinar a maior largura. Se for um BD local com poucos dados, provavelmente será imperceptível, mas no caso de um BD SQL com muitos dados, talvez não seja aceitável.
No caso de um grid, se você tiver [i:7a4f6ad2e3]a priori[/i:7a4f6ad2e3] uma lista do que vai ser exibido na coluna, basta determinar o maior comprimento de texto (via Grid.Canvas.TextWidth) e fazer esse valor ser a largura da coluna (some 2 (ou 4?) para compensar as linhas do grid).
Se for um dbgrid, o problema é o tempo gasto em obter os valores das colunas para determinar a maior largura. Se for um BD local com poucos dados, provavelmente será imperceptível, mas no caso de um BD SQL com muitos dados, talvez não seja aceitável.
GOSTEI 0
Marco Salles
23/08/2005
Não lembro de que tópico você está falando,
O Tópico é este :
http://forum.devmedia.com.br/viewtopic.php?t=67061&highlight=dbgrid+largura&sid=c5a936079e90bae5f6667f854b2b9244
GOSTEI 0
Massuda
23/08/2005
[quote:219b2add75=´Marco Salles´]O Tópico é este...[/quote:219b2add75]Bom, continua valendo o que escrevi no meu post anterior.
GOSTEI 0
Marco Salles
23/08/2005
Bom, continua valendo o que escrevi no meu post anterior.
entendido , mas ainda estou com uma duvida
Se for um dbgrid, o problema é o tempo gasto em obter os valores das colunas para determinar a maior largura. Se for um BD local com poucos dados, provavelmente será imperceptível, mas no caso de um BD SQL com muitos dados, talvez não seja aceitável.
Mas voce disse que o basta determinar o maior comprimento do texto via
Db DbGrid.Canvas.TextWidth...
Mas ai que esta o problema ;
1)Em que evento determinar
Mas para obter este valores das colunas , acredito que no proprio OnDrawCollum , não daria certo... Porque não se sabe exatamente em que ponto se começa a desenhar na grid...
2) E como associar o DbGrid.Canvas.TextWidth ao campo especifico que se dejesa dimensionar a largura.. O Que eu quero dizer é que seria mais coerente se existisse Algo assim;
DbGrid1.Columns[i]..Canvas.TextWidth , porque ai voce estaria modelando a largura especificamente para a coluna i
GOSTEI 0
Massuda
23/08/2005
[quote:d9ff03ac1f=´Marco Salles´]1)Em que evento determinar[/quote:d9ff03ac1f]No tópico que você citou, seria num dos eventos de clique do DBGrid, por exemplo, OnCellClick, OnTitleClick ou OnDblClick.
Se quiser que o DBGrid já apareça com as colunas dimensionadas conforme o conteúdo delas, o próprio DBGrid não teria um evento apropriado, melhor seria fazer um método (no form ou num derivado de TDBGrid) que fizesse o redimensionamento e que fosse chamado no OnCreate ou OnShow do form depois do DataSet ligado ao DBGrid estar pronto para uso.
[quote:d9ff03ac1f=´Marco Salles´]...para obter este valores das colunas , acredito que no proprio OnDrawCollum , não daria certo...[/quote:d9ff03ac1f]A largura da coluna não tem relação com o desenho da coluna... você pode a qualquer instante mudar a largura das colunas usando a propriedade TDBGrid.Columns[].Width. Entretanto, o fato de você alterar a largura de uma coluna irá disparar um evento de desenho, já que o desenho da coluna precisará ser atualizado.
[quote:d9ff03ac1f=´Marco Salles´]E como associar o DbGrid.Canvas.TextWidth ao campo especifico que se dejesa dimensionar a largura...[/quote:d9ff03ac1f]Quando for fazer o cálculo da largura, imagino que seria algo assim...[list:d9ff03ac1f][*:d9ff03ac1f]dar um DisableControls no DataSet[*:d9ff03ac1f]gerar um bookmark da posição atual no DataSet[*:d9ff03ac1f]ir para o início do DataSet[*:d9ff03ac1f]percorrer o DataSet procurando pelo maior comprimento, em pixels (use TDBGrid.Canvas.TextWidth), do texto da coluna do DataSet[*:d9ff03ac1f]ajustar o valor de TDBGrid.Columns[].Width[*:d9ff03ac1f]mover para a posição original do DataSet, previamente salva num bookmark[*:d9ff03ac1f]dar um EnableControls no DataSet[/list:u:d9ff03ac1f]
[quote:d9ff03ac1f=´Marco Salles´]...DbGrid1.Columns[i]..Canvas.TextWidth[/quote:d9ff03ac1f]Não faz sentido pois o canvas é toda a superfície de desenho do controle. O fato do controle ser subdividido em colunas não implica em criar subjanelas (aqui janela no sentido Windows). Um exemplo é o TLabel, que não tem canvas próprio, embora seja algo que é desenhado no form.
Se quiser que o DBGrid já apareça com as colunas dimensionadas conforme o conteúdo delas, o próprio DBGrid não teria um evento apropriado, melhor seria fazer um método (no form ou num derivado de TDBGrid) que fizesse o redimensionamento e que fosse chamado no OnCreate ou OnShow do form depois do DataSet ligado ao DBGrid estar pronto para uso.
[quote:d9ff03ac1f=´Marco Salles´]...para obter este valores das colunas , acredito que no proprio OnDrawCollum , não daria certo...[/quote:d9ff03ac1f]A largura da coluna não tem relação com o desenho da coluna... você pode a qualquer instante mudar a largura das colunas usando a propriedade TDBGrid.Columns[].Width. Entretanto, o fato de você alterar a largura de uma coluna irá disparar um evento de desenho, já que o desenho da coluna precisará ser atualizado.
[quote:d9ff03ac1f=´Marco Salles´]E como associar o DbGrid.Canvas.TextWidth ao campo especifico que se dejesa dimensionar a largura...[/quote:d9ff03ac1f]Quando for fazer o cálculo da largura, imagino que seria algo assim...[list:d9ff03ac1f][*:d9ff03ac1f]dar um DisableControls no DataSet[*:d9ff03ac1f]gerar um bookmark da posição atual no DataSet[*:d9ff03ac1f]ir para o início do DataSet[*:d9ff03ac1f]percorrer o DataSet procurando pelo maior comprimento, em pixels (use TDBGrid.Canvas.TextWidth), do texto da coluna do DataSet[*:d9ff03ac1f]ajustar o valor de TDBGrid.Columns[].Width[*:d9ff03ac1f]mover para a posição original do DataSet, previamente salva num bookmark[*:d9ff03ac1f]dar um EnableControls no DataSet[/list:u:d9ff03ac1f]
[quote:d9ff03ac1f=´Marco Salles´]...DbGrid1.Columns[i]..Canvas.TextWidth[/quote:d9ff03ac1f]Não faz sentido pois o canvas é toda a superfície de desenho do controle. O fato do controle ser subdividido em colunas não implica em criar subjanelas (aqui janela no sentido Windows). Um exemplo é o TLabel, que não tem canvas próprio, embora seja algo que é desenhado no form.
GOSTEI 0
Massuda
23/08/2005
Percebi que não expliquei como saber qual coluna deve ser tratada no caso de optar por fazer num dos eventos de clique do TDBGrid.
No caso do OnCellClick e OnTitleClick, o (tratador do) evento recebe um objeto Column, basta pegar o valor Column.Field que você tem acesso ao campo no DataSet.
No caso do OnDblClick, teria que capturar a posição do mouse usando um dos eventos de mouse (por exemplo, OnMouseDown) e no (tratador do) evento OnDlbClick, pegar a posição do mouse e converter em coordenadas do DBGrid usando o método TDBGrid.MouseCoord. Sabendo qual coluna foi clicada, basta usar TDBGrid.Columns para obter o Column correspondente e daí é igual ao caso anterior.
@moderação:
Talvez parte deste tópico devesse ser movido para o tópico que o Marco Salles citou?
No caso do OnCellClick e OnTitleClick, o (tratador do) evento recebe um objeto Column, basta pegar o valor Column.Field que você tem acesso ao campo no DataSet.
No caso do OnDblClick, teria que capturar a posição do mouse usando um dos eventos de mouse (por exemplo, OnMouseDown) e no (tratador do) evento OnDlbClick, pegar a posição do mouse e converter em coordenadas do DBGrid usando o método TDBGrid.MouseCoord. Sabendo qual coluna foi clicada, basta usar TDBGrid.Columns para obter o Column correspondente e daí é igual ao caso anterior.
@moderação:
Talvez parte deste tópico devesse ser movido para o tópico que o Marco Salles citou?
GOSTEI 0
Sandra
23/08/2005
@moderação:
Talvez parte deste tópico devesse ser movido para o tópico que o Marco Salles citou?
Massuda,
*Quebrar um tópico* até tem jeito mas, infelizmente, o php não permite mover parte do tópico e juntar ao outro, como acontece com o IPB, assim como não sei dizer também se com outras atualizações (do phpBB) isto seja possível.
No caso, terá que responder lá também. Ou então, uma maneira menos redundante, responder ao tópico direcionando respostas e questionamentos (futuros) para este.
No que precisar, questione! :D
GOSTEI 0
Massuda
23/08/2005
...responder ao tópico direcionando respostas e questionamentos (futuros) para este.
Farei isso. Obrigado pelo esclarecimento.GOSTEI 0
Marco Salles
23/08/2005
dar um DisableControls no DataSet
gerar um bookmark da posição atual no DataSet
ir para o início do DataSet
percorrer o DataSet procurando pelo maior comprimento, em pixels (use TDBGrid.Canvas.TextWidth), do texto da coluna do DataSet
ajustar o valor de TDBGrid.Columns[].Width
mover para a posição original do DataSet, previamente salva num bookmark
dar um EnableControls no DataSet
percorrer o DataSet procurando pelo maior comprimento, em pixels (use TDBGrid.Canvas.TextWidth), do texto da coluna do DataSet
[b:2c82471823]Usar um While not eof do Mesmo ne massusa , seguido de codigo para se guardar o maior valor encontrado[/b:2c82471823] :?: :?: :?:
e para finalisar a minha duvida quanto :
2) E como associar o DbGrid.Canvas.TextWidth ao campo especifico que se dejesa dimensionar a largura..
:!: :!: :!:
eu não tinha ainda verificado os parametros do metodo TDBGrid.Canvas.TextWidth..
Fui conferiri e vi que necessita de um Texto
Então é so colocar o texto da coluna que se quer determinar.. Sem problema
Quanto ao tópico esta no lugar errado, eu tentei apenas encaixar , algo a mais no presente tópico.... Uma discussão de algo que ja apareceu publicamente no forum e não se teve resposta...
Sinceramente , eu nen estou precisando desse método mas é sempre bom participar de um debate com o massuda. A gente ganha muito.
GOSTEI 0