GRAVAR POSICAO DE CONTROLES NO FORM

USUARIO.EXCLUIDOS 19/12/2003 09:29:01
#1701
Como faço para gravar a posição e o tamanho dos controles no Form em um arquivo ini?
LIONDAS 19/12/2003 14:57:01
#1757
Resposta escolhida
Olá Zeus, não seria mais fácil guardar estes valores no registro do Windows ? O exemplo abaixo guarda a posicao do form1 mas pode guardar qualquer valor :

Private Sub Form_Load()
Form1.Top = GetSetting("NomeMeuAplicativo", "Posicoes", "Form1Top", 0)
Form1.Left = GetSetting("NomeMeuAplicativo", "Posicoes", "Form1Left", 0)
End Sub

Private Sub Form_Unload(Cancel As Integer)
SaveSetting "NomeMeuAplicativo", "Posicoes", "Form1Top", Form1.Top
SaveSetting "NomeMeuAplicativo", "Posicoes", "Form1Left", Form1.Left
End Sub
LIONDAS 19/12/2003 15:08:56
#1762
Bom, se quer em arquivo ini entao tente esta :



Const NomeArquivoIni = "c:    este.ini"

Private Declare Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, _
ByVal nSize As Long, ByVal lpFileName As String) As Long

Private Declare Function WritePrivateProfileString Lib "kernel32" _
Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

Public Function GravaINI(sSection As String, sKey As String, ByVal sValue As String) As Boolean
Dim lR As Long
Dim sItemValue As String
sValue = Trim$(sValue)
sItemValue = Trim$(sItemValue) & vbNullChar
lR = WritePrivateProfileString(sSection, sKey, sValue, NomeArquivoIni)
If lR = 0 Then GravaINI = False Else GravaINI = True
End Function

Public Function LeINI(sSection As String, sKey As String, sDefault As String) As String
Dim lR As Long
Dim sReturnedValue As String
sReturnedValue = Space$(512)
lR = GetPrivateProfileString(sSection, sKey, sDefault, sReturnedValue, 512, NomeArquivoIni)
If lR = 0 Then LeINI = vbNullString Else LeINI = Left$(sReturnedValue, lR)
End Function


Private Sub Form_Load()
Form1.Top = LeINI("Posicoes", "Form1Top", 0)
Form1.Left = LeINI("Posicoes", "Form1Left", 0)
End Sub

Private Sub Form_Unload(Cancel As Integer)
GravaINI "Posicoes", "Form1Top", Form1.Top
GravaINI "Posicoes", "Form1Left", Form1.Left
End Sub

LIONDAS 22/12/2003 09:10:03
#1969
Desculpe não ter respondido antes mas é o seguinte ;

A pavalra "Posicoes" é só um termo para especificar a seçao onde será guardada a informacao e Form1Top seria a chave, Veja como vai ficar no arquivo ini :

[Posicoes]
Form1Top = 50
Form1Left = 90

Na verdade com o código que postei vc não precisa se preocupar com nada que é gravado e de que forma tambem, é só utilizar a funcao e pronto.

Zeus para utilizar arrays faca o seguinte:



Private Sub Form_Load()
Dim x As Integer
For x = 0 To Text1.Count - 1
Text1(x).Top = LeINI("Posicoes", "Text1_" & x & "_Top", 0)
Text1(x).Left = LeINI("Posicoes", "Text1_" & x & "_Left", 0)
Next
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim x As Integer
For x = 0 To Text1.Count - 1
GravaINI "Posicoes", "Text1_" & x & "_Top", Text1(x).Top
GravaINI "Posicoes", "Text1_" & x & "_Left", Text1(x).Left
Next
End Sub

LIONDAS 22/12/2003 09:13:10
#1970
Com o codigo acima o arquivo ini ficaria assim :

[Posicoes]
Text1_0_Top=0
Text1_0_Left=0
Text1_1_Top=500
Text1_1_Left=0
Text1_2_Top=1000
Text1_2_Left=0
Text1_3_Top=1500
Text1_3_Left=0

Lembre-se que os valores comecara tudo com 0, pois o valor padrao que coloquei no exemplo foi 0, mas pode ser alterado :

'Coloquei
Text1(x).Top = LeINI("Posicoes", "Text1_" & x & "_Top", 0)

''Pode mudar para
Text1(x).Top = LeINI("Posicoes", "Text1_" & x & "_Top", 100)
LIONDAS 22/12/2003 09:48:42
#1982
Zeus o codigo de exemplo é só para lhe mostrar como guardar as posicoes e restaura-las posteriormente, vc tera que adapatar o código para o que vc quer.
Mesmo assim darei uma olhada no seu projeto, ok ?
LIONDAS 22/12/2003 09:59:54
#1988
Ve se agora vai :

Private Sub Form_Load()
Dim controle As Control
For Each controle In Me.Controls
controle.Top = LeINI("Posicoes", controle.Name & "(" & controle.Index & ")Top", 0)
controle.Left = LeINI("Posicoes", controle.Name & "(" & controle.Index & ")Left", 0)
Next
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim controle As Control
For Each controle In Me.Controls
GravaINI "Posicoes", controle.Name & "(" & controle.Index & ")Top", controle.Top
GravaINI "Posicoes", controle.Name & "(" & controle.Index & ")Left", controle.Left
Next
End Sub
LIONDAS 22/12/2003 10:17:35
#1991
Para o código acima funcionar todos os controles tem que ser array. Até os botoes e labels...
LIONDAS 22/12/2003 14:14:50
#2036
Nao entendi muito bem o seu codigo do projeto !

Zeus, vc entendeu o codigo que te mandei ? As funcoes LeIni e GravaIni precisam ter como parametro o nome da chave e o valor.
Como vc tem controles que possuem indice, vc nao pode gravar somente o nome pois causaria conflito na hora de ler os dados, entao neste caso vc deve criar um nome que varia conforme o indice, algo parecido como NomeControleIndex, quando nao houver indice vc so precisa gravar o nome do controle algo como NomeControle.
Estude um pouco mais o codigo que lhe enviei....
LIONDAS 22/12/2003 16:12:02
#2073
ZEUS, estudarei melhor o seu projeto para ver se da para ajudar, fique no aguardo, ok ?
LIONDAS 23/12/2003 09:35:01
#2151
Zeus, se só o label é array entao tente :

Private Sub Form_Load()
Dim controle As Control
For Each controle In Me.Controls
If TypeOf controle Is Label Then
controle.Top = LeINI("Posicoes", controle.Name & ".Top", 0)
controle.Left = LeINI("Posicoes", controle.Name & ".Left", 0)
controle.Width = LeINI("Posicoes", controle.Name & ".Width", 0)
controle.Heigth = LeINI("Posicoes", controle.Name & ".Heigth", 0)
ElseIf TypeOf controle Is TextBox Then
controle.Top = LeINI("Posicoes", controle.Name & "(" & controle.Index & ").Top", 0)
controle.Left = LeINI("Posicoes", controle.Name & "(" & controle.Index & ").Left", 0)
controle.Width = LeINI("Posicoes", controle.Name & "(" & controle.Index & ").Width", 0)
controle.Heigth = LeINI("Posicoes", controle.Name & "(" & controle.Index & ").Heigth", 0)
End If
Next
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim controle As Control
For Each controle In Me.Controls
If TypeOf controle Is Label Then
GravaINI "Posicoes", controle.Name & "(" & controle.Index & ").Top", controle.Top
GravaINI "Posicoes", controle.Name & "(" & controle.Index & ").Left", controle.Left
GravaINI "Posicoes", controle.Name & "(" & controle.Index & ").Width", controle.Width
GravaINI "Posicoes", controle.Name & "(" & controle.Index & ").Heigth", controle.Heigth
ElseIf TypeOf controle Is TextBox Then
GravaINI "Posicoes", controle.Name & ".Top", controle.Top
GravaINI "Posicoes", controle.Name & ".Left", controle.Left
GravaINI "Posicoes", controle.Name & ".Width", controle.Width
GravaINI "Posicoes", controle.Name & ".Heigth", controle.Heigth
End If
Next
End Sub

Nao esqueça de mudar os valores padroes 0 na funcao LeIni.
Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas