Mais controle com janelas...

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

rcb2002
Usuário Nível 2
Usuário Nível 2
Mensagens: 58
Registrado em: 19 Jan 2010 23:16
Localização: Salvador

Mais controle com janelas...

Mensagem por rcb2002 »

Pessoal, estou com um "problemasso" já a alguns dias, sem solução: fiz umas máscaras "telas" para um programa, carrego todas como pano de fundo para as janelas. O programa ficou mais "profissional", os campos, caixas e botões eu meço milimetricamente pra parecerem parte da tela de fundo ( e a propósito acho essa uma das inconveniências da Minigui - os BMP têm que ficar lá numa pasta, Imagens; deveria poder colocar tudo dentro do EXE para o caso de o usuário apagar acidentalmente a imagem o programa não ser afetado, mas tudo bem... a dúvida não é essa).
Acontece que agora decidi abrir uma janela de cadastro, por exemplo, DENTRO da janela MAIN, só que posicionando ela lá dentro pra cobrir "só uma parte" da MAIN (como se um novo formulário fosse carregado ali, com uma bela tela de fundo, sem o usuário perceber). Suprimindo os botões FECHAR, MINIMIZAR, a BARRA DE TÍTULOS e toda a moldura da janela, fica perfeito. O problema está no POSICIONAMENTO DESSA JANELA SOBRE A MAIN. Ela é CHILD e eu estou usando uma referência relativa pra determinar sua linha e coluna, como abaixo:

Código: Selecionar todos

PUBLIC	Linha := int( (GetDesktopRealHeight() - 761) /2 ); Coluna := int( (GetDesktopRealWidth() - 1200)/2 )
DEFINE WINDOW TEMPLATE AT Linha , Coluna WIDTH 1200 HEIGHT 791 MAIN
e na janela que vai em cima dessa faço o mesmo, alterando os valores de LINHA E COLUNA e o WINDOWTYPE.

O problema: não há meio de eu conseguir posicionar a segunda janela sobre a primeira,, "cirurgicamente", como eu esperava que fosse. Qualquer valor que eu coloco em LINHA e COLUNA deixam a janela NA ORIGEM da MAIN (0,0). O que eu imaginava era que a interna ficasse LIMITADA pela externa e que os valores usados para posicioná-la fossem relativos à ORIGEM da MAIN, não à origem da tela.

Alguém pode me ajudar?
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mais controle com janelas...

Mensagem por Pablo César »

Eu não sei se te entendi direito, mas eu acho que seria melhor você desenhar essa janela, seja com bmp ou até mesmo interativamente com linhas, requadros, labels e que tudo isso fosse parte do mesmo form do Main. Assim você não precisaria estar controlando o movimento, posicionamento da segunda janela. Daria para você mostrar um Print Screen de tudo isso ?
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mais controle com janelas...

Mensagem por Pablo César »

a propósito acho essa uma das inconveniências da Minigui - os BMP têm que ficar lá numa pasta, Imagens; deveria poder colocar tudo dentro do EXE para o caso de o usuário apagar acidentalmente a imagem o programa não ser afetado, mas tudo bem...
Esta característica não é somente da HMG ou Minigui. Eu também achava que deveria ser embutido no próprio EXE, mas grandes linguagens mantém também esse padrão. Uma solução seria compactar os arquivos gráficos bmp e incorporá-lo no seu código fonte em forma binária, só que iria aumentar de tamanho o seu executável. Mas não sei se valeria a pena considerando que deletar os arquivo gráfico (geralmente numa sub-pasta) isso pode ocorrer eventualmente.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
MSDN
Usuário Nível 4
Usuário Nível 4
Mensagens: 741
Registrado em: 28 Nov 2003 15:55
Localização: CWB
Contato:

Mais controle com janelas...

Mensagem por MSDN »

Prezado,

Com a MiniGUI Extended, vc consegue realizar muito facilmente tudo o que relatou, inclusive na pasta samples, existe exemplo.
Para posicionar uma janela, da forma que desejar, sem ser CHILD (não aconselho), basta criar dentro da janela MAIN uma outra janela do tipo PANEL, fica perfeito. Quanto aos BMPs, vc pode utilizar arquivos de recursos (RC) onde define as imagens a serem utilizadas em seu sistema, e que serão incluídas no seu EXE.
Continue postando aqui suas dúvidas, além de resolver seus problemas, ajudará outras pessoas.

Abraços

Marcelo Neves
rcb2002
Usuário Nível 2
Usuário Nível 2
Mensagens: 58
Registrado em: 19 Jan 2010 23:16
Localização: Salvador

Mais controle com janelas...

Mensagem por rcb2002 »

Obrigado a ambos e vou continuar sempre (ou enquanto insistir em Clipper/Minigui) postando e usando esse Fórum como referência quando tenho dúvidas. Em 100% dos casos vcs dão uma solução brilhante para meus problemas.

Quanto ao atual, abaixo duas telas de exemplo:

http://www.sendspace.com/file/r3cuho



MSDN, Eu USO MiniGUI Extended! E vasculhei todo o SAMPLES atrás de exemplos assim (minha base para programar ainda são os SAMPLES). Sem querer abusar, sabe qual dos exemplos se refere a isso? Outra coisa: Não tem WindowType PANEL aqui! (Child, Main, Modal, SplitChild, Standard, MDI, MainMDI e MDIChild) e também nunca ouvi falar nesse exemplo. Será que tem algo em SAMPLES também? Por favor sinta-se livre pra olhar as imagens e auxiliar na solução para o meu "enigma".

Mestre Pablo,
Pelas imagens vc vai ver que quando reposiciono a segunda sobre a primeira não consigo descer mais. Ela desloca horizontalmente (a coluna) mas verticalmente não (linha). E o mais engraçado: quando tento usar qualquer outro tipo de janela que não CHILD obtenho um erro de sintaxe em Window, ainda na compilação. Só tá aceitando CHILD. Não era pra isso funcionar?

Código: Selecionar todos

DEFINE WINDOW TEMPLATE AT Linha+30, Coluna WIDTH 1200 HEIGHT 760 NOMINIMIZE NOMAXIMIZE NOSIZE NOSYSMENU NOCAPTION CHILD
Já tentei de tudo, só aqui agora pra encontrar a solução! Mais uma vez, obrigado.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mais controle com janelas...

Mensagem por Pablo César »

Eu particularmente não gosto de carregar os forms, eu prefiro mesmo gerar o código e colar no meu código fonte. A segunda tela, você poderia apresentar os elementos sem ter que abrir nova janela. Você pode criar uma função que apenas posicione os TEXTBOX com a clausula OF <form.main> (por exemplo). Aliás, pode posicionar todos os elementos e escondê-los e depois chamar a função de cadastro e seria apenas para mostrá-los ao usuário. Para isso utilize: hide e show.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
rcb2002
Usuário Nível 2
Usuário Nível 2
Mensagens: 58
Registrado em: 19 Jan 2010 23:16
Localização: Salvador

Mais controle com janelas...

Mensagem por rcb2002 »

Cara eu entendo... só q acho q não vou ter a mesma qualidade: ainda gostaria de usar as telas, será que não tem jeito? O outro usuário (MSDN) falou algo sobre janelas tipo PANEL, pode ser que isso resolva... enquanto não vejo outra solução vou começar tentando arredondar os cantos das textboxes...
MSDN
Usuário Nível 4
Usuário Nível 4
Mensagens: 741
Registrado em: 28 Nov 2003 15:55
Localização: CWB
Contato:

Mais controle com janelas...

Mensagem por MSDN »

Prezado,

Analise esses exemplos :

1 - C:\MiniGUI\SAMPLES\BASIC\REGIONS_2

2 - C:\MiniGUI\SAMPLES\BASIC\CONTAINERS

O primeiro, mostra como usar uma imagem sendo o form, e como utilizar arquivos de recursos (RC).
O segundo, mostra dois exemplos (pasta PANEL e PANEL2), de como inserir uma janela dentro de outra usando o método PANEL.

Abraços
rcb2002
Usuário Nível 2
Usuário Nível 2
Mensagens: 58
Registrado em: 19 Jan 2010 23:16
Localização: Salvador

Mais controle com janelas...

Mensagem por rcb2002 »

Pois é, pessoal... primeiramente obrigado pela ajuda. Confesso que agora eu cismei e vou querer o sistema assim: imagina um sistema web, online, onde o REFRESH só acontece nos FRAMES? Eu fuço um pouquinho em web mas não vou ter tempo de converter todo o sistema agora, pronto, pra outra plataforma. Segui 50% do conselho de cada um: larguei a ideia de desenhar a tela toda em BMP; só carrego o fundo e faço o resto como o Pablo sugeriu; crio tudo escondido e vou mostrando conforme a necessidade. Do MSDN peguei o exemplo do PANEL, tá ficando perfeito. Agora só mais uma dúvida: tem como me dar um exemplo de como esconder um "grid" (ou criar ele depois com a cláusula OF <FORM.secondary> (não entendi bem como isso funciona). Pq o GRID não tem VISIBLE .F. e não sei como usar o OF.
O detalhe é que esse post provavelmente vai ser útil um dia pra outros membros do Fórum; acho difícil que ninguém até hoje tenha tido a necessidade de algo assim, telas "atualizando" dentro da Main, não janelas abrindo, sabe? O sistema todo rodando numa janela só. Seria legal outras pessoas que já tiveram esse problema postarem aqui como solucionaram... acho q é tendência esse negócio de abrir tudo numa tela só, fica mais elegante e pra o usuário (como meu sistema também tem uma parte que alimenta os dados via Web) parece que tudo é online.
Obrigado galera!!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mais controle com janelas...

Mensagem por Pablo César »

só mais uma dúvida: tem como me dar um exemplo de como esconder um "grid"
Tudo depende como você vai querer que aconteçam o aparecimento e a ocultação de cada componente. Mas basicamente todas é dada pela mesma função: DoMethod(<Form>,<Componente>,"hide" ou "show"). Eu peguei o exemplo C:\MiniGUI\SAMPLES\BASIC\Grid e mudei as duas primeiras opções desse menu:

Código: Selecionar todos

/*
 * MINIGUI - Harbour Win32 GUI library Demo
 *
 * Copyright 2002 Roberto Lopez <harbourminigui@gmail.com>
 * http://harbourminigui.googlepages.com/

 * MiniGUI 1.0 Experimantal Build 6 - Grid Demo
 * (c) 2005 Jacek Kubica <kubica@wssk.wroc.pl>
 *
 * New property - ColumnWidth(nColumn) for BROWSE & GRID controls
 * New methods for BROWSE & GRID controls
   - ColumnAutoFit(nColumn)  - set column width to best fit regarding to column contents
   - ColumnAutoFitH(nColumn) - set column width to best fit regarding to column header & column contents
   - ColumnsAutoFit  - set widths of all columns in control to best fit regarding to column contents
   - ColumnsAutoFitH - set widths of all columns in control to best fit regarding to column header & column contents
*/

#include "minigui.ch"

Function Main()

Local aRows [20] [3]

	DEFINE WINDOW Form_1 ;
		AT 0,0 ;
		WIDTH 450 ;
		HEIGHT 400 ;
		TITLE 'MiniGUI 1.0 Experimantal Build 6 - Grid Demo' ;
		MAIN 

		aRows [1]	:= {'Simpson','Homer','555-5555'}
		aRows [2]	:= {'Mulder','Fox','324-6432'} 
		aRows [3]	:= {'Smart','Max','432-5892'} 
		aRows [4]	:= {'Grillo','Pepe','894-2332'} 
		aRows [5]	:= {'Kirk','James','346-9873'} 
		aRows [6]	:= {'Barriga','Carlos','394-9654'} 
		aRows [7]	:= {'Flanders','Ned','435-3211'} 
		aRows [8]	:= {'Smith','John','123-1234'} 
		aRows [9]	:= {'Pedemonti','Flavio','000-0000'} 
		aRows [10]	:= {'Gomez','Juan','583-4832'} 
		aRows [11]	:= {'Fernandez','Raul','321-4332'} 
		aRows [12]	:= {'Borges','Javier','326-9430'} 
		aRows [13]	:= {'Alvarez','Alberto','543-7898'} 
		aRows [14]	:= {'Gonzalez','Ambo','437-8473'} 
		aRows [15]	:= {'Batistuta','Gol','485-2843'} 
		aRows [16]	:= {'Vinazzi','Amigo','394-5983'} 
		aRows [17]	:= {'Pedemonti','Flavio','534-7984'} 
		aRows [18]	:= {'Samarbide','Armando','854-7873'} 
		aRows [19]	:= {'Pradon','Alejandra','???-????'} 
		aRows [20]	:= {'Reyes','Monica','432-5836'} 

		@ 10,10 GRID Grid_1 ;
			WIDTH 200 ;
			HEIGHT 330 ;
			HEADERS {'Last Name','First Name','Phone'} ;
			WIDTHS {140,140,140};
			ITEMS aRows ;
			VALUE 1 ;
			TOOLTIP 'Editable Grid Control' ;
			EDIT ;
			JUSTIFY { BROWSE_JTFY_LEFT,BROWSE_JTFY_RIGHT, BROWSE_JTFY_RIGHT }

		@ 10,240 GRID Grid_2 ;
			WIDTH 200 ;
			HEIGHT 330 ;
			HEADERS {'Last Name','First Name','Phone'} ;
			WIDTHS {140,140,140};
			ITEMS aRows ;
			VALUE 1 ;
			TOOLTIP 'Editable Grid Control' ;
			ON HEADCLICK { {||MsgInfo('Click 1')} , {||MsgInfo('Click 2')} , {||MsgInfo('Click 3')} } ;
			JUSTIFY { BROWSE_JTFY_LEFT,BROWSE_JTFY_CENTER, BROWSE_JTFY_CENTER } 

		DEFINE MAIN MENU
			POPUP 'New Functions Tests'

				ITEM 'Esconde o Grid 2' ACTION DoMethod("Form_1","Grid_2","hide")
				ITEM 'Mostra o Grid 2' ACTION DoMethod("Form_1","Grid_2","show")
				ITEM 'GetColumnWidth Column 3 Grid 1'          ACTION MsgBox( str(Form_1.Grid_1.ColumnWidth(3)) )
				SEPARATOR
				ITEM 'SetColumnWidth Column 1 Grid 1 To 100 '  ACTION {|| (Form_1.Grid_1.ColumnWidth(1) := 100)}
				ITEM 'SetColumnWidth Column 1 Grid 2 To 100 '  ACTION {|| (Form_1.Grid_1.ColumnWidth(2) := 100)}
				ITEM 'SetColumnWidth Column 1 Grid 3 To 100 '  ACTION {|| (Form_1.Grid_1.ColumnWidth(3) := 100)}
				SEPARATOR
				ITEM 'SetColumnWidth Column 1 Grid 1 To Auto'  ACTION Form_1.Grid_1.ColumnAutoFit(1)
				ITEM 'SetColumnWidth Column 2 Grid 1 To Auto'  ACTION Form_1.Grid_1.ColumnAutoFit(2)
				ITEM 'SetColumnWidth Column 1 Grid 1 To AutoH' ACTION Form_1.Grid_1.ColumnAutoFitH(1)
				ITEM 'SetColumnWidth Column 2 Grid 1 To AutoH' ACTION Form_1.Grid_1.ColumnAutoFitH(2)
				SEPARATOR
				ITEM 'Set Auto Width for Grid_1'               ACTION Form_1.Grid_1.ColumnsAutoFit
				ITEM 'Set Auto Width for Grid_2'               ACTION Form_1.Grid_2.ColumnsAutoFit
				SEPARATOR
				ITEM 'Set AutoFit Widths for Grid_1 (header)'  ACTION Form_1.Grid_1.ColumnsAutoFitH
				ITEM 'Set AutoFit Widths for Grid_2(header)'   ACTION Form_1.Grid_2.ColumnsAutoFitH

			END POPUP
		END MENU
	END WINDOW
	CENTER WINDOW Form_1
	ACTIVATE WINDOW Form_1
Return Nil
Compile e veja se faz sentido esconder e re-exibir os componentes. Imagino que deverá estar atrelado a alguma condição. Aliás pode também colocar no DEFINE WINDOW <FORM> no item ON INIT <sua função que esconda>. Não sei, são apenas sugestões. Vai de cada um, depende a criatividade que cada um possa ter e com a finalidade em que possa ter.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Mais controle com janelas...

Mensagem por microvolution »

gente minha dúvida é a seguinte:
como faço pra fechar 100% uma janela?
somente o RELEASE ou ele apenas simula um fechamento?
Tenho uma tela de LOGIN que é fechada no momento certo, mas,depois que está na hora do MENU PRINCIPAL com o POPUP MENU ela (a tela de login) aparece novamente.
Alguém sabe o que fazer?
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Mais controle com janelas...

Mensagem por microvolution »

continuando minha dúvida:
qual diferença?
FLogin.Center
FLogin.Activate
para:
FLogin.Center()
FLogin.Activate()
ou para:
Center Window Flogin
Activate Window Flogin

Diante disso aparecem para mim mensagens completamente diferentes; MAS, infelizmente mesmo reativando o "WINDOW MAIN F1" com o comando F1.SHOW e F1.MAXIMIZE continua aparecendo junto o FLOGIN para digitar senha novamente.
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mais controle com janelas...

Mensagem por Pablo César »

FLogin.Center = Center Window Flogin
FLogin.Activate = Activate Window Flogin

FLogin.Center(): Center é uma propriedade, mas também utiliza a função DoMethod e que chama a função em C_CENTER em C.
FLogin.Activate(), chama a função ActivateWindow( <cNome> )

Para compreender tudo você deveria olhar os fontes que estão disponíveis na pasta SOURCE.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Responder