Jump to content

Recommended Posts

Uma duvida. Se eu quiser criar uma quantidade de Gui definida pelo .ini ou por qualquer outra coisa (um valor variável), eu vou ter de criar um while de 1 até a quantidade de itens?

exemplo, meu GUI decidiu que quer ter 15 itens (labels) nele:


Como vou criar 15 labels?
;tem que ser $L1 até $L15 e $game_list1 até $game_list15

 

$L1=GUICtrlCreateLabel ($game_list1 $RECUO, $posicion+$espaco_inicial, 309,30)

$L2=GUICtrlCreateLabel ($game_list2 $RECUO, $posicion+$espaco_inicial, 309,30)

$L3=GUICtrlCreateLabel ($game_list3 $RECUO, $posicion+$espaco_inicial, 309,30)

 

até o $L15, mas esse valor pode mudar sempre que eu abrir o programa, então como vou fazer o $L virar um $L1,2,3,4,5...e o $game_list virar $game_list1,2,3,4?

$itens_menu=15 
$posicion=130
$count=1
$espaco_inicial=0
$espaco_entre=40

while $itens_menu
;exemplo de como a sequencia devia ser?
;como eu fundo $game_list & $count para virar $game_list1,$game_list2,$game_list3~
;como eu fundo $L & $count para ficar $L1,$L2,$L3~

$L & $count=GUICtrlCreateLabel ($game_list & $count,  $RECUO, $posicion+$espaco_inicial, 309,30)
$count+=1
$espaco_inicial+=$espaco_entre

wend
Edited by Pedro Pinheiro

Share this post


Link to post
Share on other sites

Olá Pedro.

 

A melhor maneira de fazer isso é usar um vetor (ou array) dinâmico para armazenar as referências de controles.

Usando teu exemplo:

#include <Array.au3>
   $itens_menu=15
   $posicion=130
   $count=1
   $espaco_inicial=0
   $espaco_entre=40
   $game_list = "blablabla "
   $RECUO=0
   GUICreate("Janela", 800, 800)
   Local $MeusLabels[0]
   For $count = 1 to $itens_menu
      _ArrayAdd($MeusLabels, GUICtrlCreateLabel($game_list & $count,  $RECUO, $posicion+$espaco_inicial, 309, 30))
      $espaco_inicial+=$espaco_entre
   Next
   GUISetState(@SW_SHOW)
   GUICtrlSetData($MeusLabels[3], "NOVO LABEL")
   _ArrayDisplay($MeusLabels)
 

Assim o array $MeusLabels vai conter exatamente a quantidade e o nro de controle de labels que a sua GUI especificar.

Este conceito pode ser aplicado a praticamente qualquer controle.

Outra grande vantagem deste método, é que como os arrays são por definição "ponteiros", eles são sempre passados por referência para outras funções.

Na prática, ao chamar funções passando como parâmetro o $MeusLabels, vc tem acesso a ver e/ou modificar quaisquer elementos do controle. Por exemplo:

#include <Array.au3>
   $itens_menu=15
   $posicion=130
   $count=1
   $espaco_inicial=0
   $espaco_entre=40
   $game_list = "blablabla "
   $RECUO=0
   GUICreate("Janela", 800, 800)
   Local $MeusLabels[0]
   For $count = 1 to $itens_menu
      _ArrayAdd($MeusLabels, GUICtrlCreateLabel($game_list & $count,  $RECUO, $posicion+$espaco_inicial, 309, 30))
      $espaco_inicial+=$espaco_entre
   Next
   GUISetState(@SW_SHOW)
   GUICtrlSetData($MeusLabels[3], "NOVO LABEL")
   _ArrayDisplay($MeusLabels)
   DESATIVA_LABELS($MeusLabels)
   _ArrayDisplay($MeusLabels)

Func DESATIVA_LABELS ($ListaLabels)
   For $Controle in $ListaLabels
      GUICtrlSetState($Controle, $GUI_HIDE)
   Next
EndFunc

Ou se quiser modificar algum label específico:

GUICtrlSetData($MeusLabels[3], "NOVO TEXTO PARA O LABEL 3")

E assim por diante.

Uso isso no meu sistema de Delivery por conta dos ingredientes ;)

  • Like 1

Share this post


Link to post
Share on other sites

@Manimal

 

Nossa. Valeu mesmo. Só me tira 1 dúvidas?

 

 

Como eu adiciono isso em "$game_list" para seguir também a sequencia "$game_list [1],[2],[3],[4],[5]"?

 

 

_ArrayAdd($MeusLabels, GUICtrlCreateLabel($game_list, $RECUO, $posicion+$espaco_inicial, 309, 30))

Edited by Pedro Pinheiro

Share this post


Link to post
Share on other sites

Pelo que eu entendi, vc tem uma "lista de games" que vc quer mostrar na tela e ir colocando o nome do game em cada label, isso?

 

O que é $game_list? É a lista dos games? Seus nomes ou o que?

 

Teoricamente vc poderia usar o atributo Caption do Label para o nome do jogo, mas se vc já tem a relação de nomes no $game_list...

 

É aí que eu me perdi... :mad2:

 

Alternativa 1 onde $Game_List é um array contendo os nomes dos jogos previamente preenchido:

#include <Array.au3>
   Local $game_list[5] = [ "Borderlands", "FarCry 3", "TrackMania", "Rainbow Six Vegas", "Left 4 Dead" ]
   $itens_menu=5
   $posicion=130
   $count=1
   $espaco_inicial=0
   $espaco_entre=40
   $RECUO=0
   GUICreate("Janela", 800, 800)
   Local $MeusLabels[0]
   For $count = 0 to $itens_menu-1
      _ArrayAdd($MeusLabels, GUICtrlCreateLabel($game_list[$count],  $RECUO, $posicion+$espaco_inicial, 309, 30))
      $espaco_inicial+=$espaco_entre
   Next
   GUISetState(@SW_SHOW)
   _ArrayDisplay($MeusLabels)
   GUICtrlSetData($MeusLabels[3], "NOVO LABEL")
   _ArrayDisplay($MeusLabels)

Alternativa 2 onde o $game_list é preenchido JUNTO com a criação dos controles e seus labels:

#include <Array.au3>
   Local $game_list[0]
   $itens_menu=5
   $posicion=130
   $count=1
   $espaco_inicial=0
   $espaco_entre=40
   $RECUO=0
   GUICreate("Janela", 800, 800)
   Local $MeusLabels[0]
   For $count = 0 to $itens_menu-1
      _ArrayAdd($game_list, IniRead(@ScriptDir & "\Games.ini", "Nomes", "Jogo" & $count+1, "Nome do Jogo"))
      _ArrayAdd($MeusLabels, GUICtrlCreateLabel($game_list[$count],  $RECUO, $posicion+$espaco_inicial, 309, 30))
      $espaco_inicial+=$espaco_entre
   Next
   GUISetState(@SW_SHOW)
   _ArrayDisplay($game_list)
   $game_list[3] = "Supreme Commander Forged Alliance"
   GUICtrlSetData($MeusLabels[3], $game_list[3])
   _ArrayDisplay($game_list)

Sempre levando em conta que estamos usando arrays unidimensionais!

Se formos usar arrays bidimensionais (matrizes), facilita pois temos no mesmo elemento todas as características de cada controle.

Melhor que isso só usando objeto. ;)

Share this post


Link to post
Share on other sites

Ops, esqueci de incluir o arquivo GAMES.INI do último exemplo

[Nomes]
Jogo1=Borderlands
Jogo2=FarCry 3
Jogo3=TrackMania
Jogo4=Rainbow Six Vegas
Jogo5=Left 4 Dead

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×