Fórum Largura do ComboBox #292783
23/08/2005
0
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
Curtir tópico
+ 0Posts
23/08/2005
Massuda
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
23/08/2005
Marco Salles
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
23/08/2005
Massuda
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
23/08/2005
Marco Salles
O Tópico é este :
http://forum.devmedia.com.br/viewtopic.php?t=67061&highlight=dbgrid+largura&sid=c5a936079e90bae5f6667f854b2b9244
Gostei + 0
23/08/2005
Massuda
Gostei + 0
24/08/2005
Marco Salles
entendido , mas ainda estou com uma duvida
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
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
24/08/2005
Massuda
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
24/08/2005
Massuda
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
24/08/2005
Sandra
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
24/08/2005
Massuda
Gostei + 0
24/08/2005
Marco Salles
[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 :
:!: :!: :!:
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
Clique aqui para fazer login e interagir na Comunidade :)