Página 1 de 2

Define window

Enviado: 08 Dez 2009 09:34
por Ricardo Mauricio
Ola a todos

Estou utilizando o projeto HMG 2.9.4 com IDE 2.9.5 do Roberto Lopez

Alguem poderia me explicar as diferenças de telas e guando eu utilizo cada uma.

Define Window
Main, Child, Modal, SplitChild, Standard

(A)

Re: Define window

Enviado: 10 Dez 2009 15:27
por Ricardo Mauricio
Ola a todos

Alguem poderia me dizer com o comando que eu desligo a opção de mover a tela ?

Re: Define window

Enviado: 10 Dez 2009 19:17
por Toledo
Ricardo Mauricio escreveu:Define Window
Main, Child, Modal, SplitChild, Standard
MAIN: como o próprio nome diz, esta será a janela principal.

CHILD: é a janela "filha" da MAIN. Apesar de ficar sobre a janela MAIN, você pode acessar as opções (Menu) da janela MAIN. Se a janela MAIN for minimizada, ela será minimizada também.

MODAL: esta é igual a CHILD, mas ela retém todo o foco do programa para ela, não permite acessar as opções da janela MAIN que a criou, até que ela seja fechada.

SPLITCHILD: esta também é uma janela "filha" da MAIN, mas você não pode mover ela para fora dos limites da janela MAIN que a criou.

STANDARD: esta janela fica livre no programa, pode tanto sobrepor como pode ser sobreposta por outras janelas.

Abraços,

Re: Define window

Enviado: 11 Dez 2009 07:27
por Toledo
Só uma observação... nas opções CHILD, MODAL e SPLITCHILD quando falo da janela MAIN, eu quero dizer a janela "PAI" que criou a janela "Filha", e não necessariamente a janela MAIN principal (Inicial).

Abraços,

Re: Define window

Enviado: 11 Dez 2009 11:01
por Ricardo Mauricio
Ola a Todos :)Pos

Colega Toledo agradeço muito sua explicação.

Fiz a pergunta pois estou com um problema de manipular as telas, coisa que eu não tinha com o clipper.

Eu abri uma tela Main e dentro do menu abri outra tela Modal ate ai tudo bem, mas quando eu abro outra tela modal e
entro e saio da erro no Ruindows e trava o micro. o que devo estar fazendo de errado.
Main/ Modal/ Modal

O pior é que tenho que abrir outra tela modal depois da ultima. Pois não quero que o usuario tenha foco da tela anterior. Dai a coisa vai pegar.
Main/ Modal/ Modal/ Modal

Da uma Dica.
Devo desabilitar as telas anteriores com Enabled, devo usar Hide ou mudo o esquema de manipulação para Main/ Child/ Child/ Modal.

Re: Define window

Enviado: 11 Dez 2009 12:57
por Toledo
Ricardo, segue abaixo um pequeno exemplo de como faço aqui...

Código: Selecionar todos

#include <minigui.ch>

Function Main
Declare Window principal
Load Window principal
principal.Center
principal.Activate
Return Nil

Function Janela1()
Declare Window janelamodal1
Load Window janelamodal1
janelamodal1.Center
janelamodal1.Activate
Return Nil

Function Janela2()
Declare Window janelamodal2
Load Window janelamodal2
janelamodal2.Center
janelamodal2.Activate
Return Nil
Em anexo está os arquivos FMG.

Abraços,

Define window

Enviado: 26 Jun 2015 23:59
por microvolution
Olá pessoal, a eu aqui traveis...

bom, de vez em quando aparece esse problema que vou relatar, mas, daí eu deixo passar batido e, o que tenho feito pra resolver é mudar o nome dele.
Exemplo:
DEFINE WINDOW F1
Então se o problema aparece eu mudo para:
DEFINE WINDOW F2.

Bom, só que agora dessa vez, não tive solução nem mudando o nome do WINDOW de F1 para F2, ou F3, F4, F5, etc...

O problema acontece já quando estou concluindo o item:
DEFINE MAIN MENU, onde as opções horizontais e seus respectivos itens verticais do POPUP/ITEM desaparecem simplesmente do nada:
POPUP Opção1
ITEM opção2
ITEM opção3
END POPUP

Então, simplesmente o formulário WINDOW F2 é criado normalmente mas, as opções do MENU POPUP não aparecem.

Então, alguém sabe o que causa isso? Já tentei a opção de excluir a pasta temporária .HBMK e compilar tudo novamente do zero, mas, não resolve. Como disse, já mudei o nome do WINDOW F2 para F3, F4, etc... e não resolve.

Aguardo sua opinião, caso saiba como solucionar.
Atenciosamente,

Define window

Enviado: 27 Jun 2015 00:50
por microvolution
vejam em anexo a imagem do FORMULÁRIO sem o MENU POPUP:
WINDOW sem MENU (desapareceram todas as opções POPUP/ITEM)
WINDOW sem MENU (desapareceram todas as opções POPUP/ITEM)
vlw pessoal!

Substituir variável por nome dentro do texto

Enviado: 27 Jun 2015 08:03
por Toledo
Amigo, só com a imagem fica difícil tentar ajudar, se possível seria bom postar um código fonte que possa ser compilável, assim ficaria mais fácil para achar onde está o erro.

Abraços,

Define window

Enviado: 27 Jun 2015 08:39
por microvolution
Prezado Toledo e companheiros, eis aí o nosso código do DEFINE WINDOW F2 com seu DEFINE MAIN MENU que funcionava:

Código: Selecionar todos

     DEFINE WINDOW F2 ;
         AT 0,0 ;
         WIDTH 800 HEIGHT 600 ;
         TITLE 'SiCCoSV - SISTEMA DE CONTROLE COMERCIAL DE ORDENS DE SERVIÇO VEICULAR' ;
         FONT 'Arial' SIZE 12 ;
         CHILD // ; // já existe o WINDOW F1 como MAIN.
            DEFINE MAIN MENU 
               for H=1 TO LEN(MENU_H)
               // ? MENU_GUI[I,1],MENU_GUI[I,2],MENU_GUI[I,3],MENU_GUI[I,4]
               // INKEY(0)
                  if MENU_H[H,1]='&Cadastros'
                     POPUP MENU_H[H,1]
                        // for CAD=1 to len(MENU_CAD)
                           POPUP MENU_CAD[1,1]
                              for CADH1=1 to len(MENU_CADH1)
                                 // ? 'MENU_CADH1[CADH1,2]',MENU_CADH1[CADH1,2]
                                 // wait
                                 MENUITEM MENU_CADH1[CADH1,1] ACTION MENU_CADH1[CADH1,2] // NAME MENU_CAD1[CAD1,3]
                              next
                           END POPUP
                           POPUP MENU_CAD[2,1]
                              // for CADH2=1 to len(MENU_CADH2)
                                 // POPUP MENU_CADH2[CADH2,1]
                                 POPUP MENU_CADH2[1,1]
                                    for CADH2V1=1 to len(MENU_CADH2V1)
                                       MENUITEM MENU_CADH2V1[CADH2V1,1] ACTION MENU_CADH2V1[CADH2V1,2] // NAME MENU_CAD1[CAD1,3]
                                    next
                                 POPUP MENU_CADH2[2,1]
                                    for CADH2V2=1 to len(MENU_CADH2V2)
                                       MENUITEM MENU_CADH2V2[CADH2V2,1] ACTION MENU_CADH2V2[CADH2V2,2] // NAME MENU_CAD1[CAD1,3]
                                    next
                                 END POPUP
                                 POPUP MENU_CADH2[3,1]
                                    for CADH2V3=1 to len(MENU_CADH2V3)
                                       MENUITEM MENU_CADH2V3[CADH2V3,1] ACTION MENU_CADH2V3[CADH2V3,2] // NAME MENU_CAD1[CAD1,3]
                                    next
                                 END POPUP
                                 POPUP MENU_CADH2[4,1]
                                    for CADH2V4=1 to len(MENU_CADH2V4)
                                       MENUITEM MENU_CADH2V4[CADH2V4,1] ACTION MENU_CADH2V4[CADH2V4,2] // NAME MENU_CAD1[CAD1,3]
                                    next
                                 END POPUP
                              // next
                           END POPUP
                           POPUP MENU_CAD[3,1]
                              for CADH3=1 to len(MENU_CADH3)
                                 MENUITEM MENU_CADH3[CADH3,1] ACTION MENU_CADH3[CADH3,2] // NAME MENU_CAD1[CAD1,3]
                              next
                           END POPUP
                        // next
                        MENUITEM MENU_CAD1[1,1] ACTION MENU_CAD1[1,2] // NAME MENU_CAD1[CAD1,3]
                     END POPUP
                  elseif MENU_H[H,1]='C&onsultas'
                     POPUP MENU_H[H,1]
                        for CON=1 to len(MENU_CON)
                           MENUITEM MENU_CON[CON,1] ACTION MENU_CON[CON,2] NAME MENU_CON[CON,3]
                        next
                     END POPUP
                  elseif MENU_H[H,1]='&Relatórios'
                     POPUP MENU_H[H,1]
                        for REL=1 to len(MENU_REL)
                           MENUITEM MENU_REL[REL,1] ACTION MENU_REL[REL,2] NAME MENU_REL[REL,3]
                        next
                     END POPUP
                  endif
                  // endif
               next
               POPUP '&Configurações'
                  for FOR=1 to len(MENU_FOR)
                     MENUITEM MENU_FOR[FOR,1] ACTION MENU_FOR[FOR,2] // NAME &MENU_FOR[FOR,3]
                  next
               END POPUP
            END MENU
   END WINDOW
   CENTER WINDOW F2
   F2.Activate()
À medida que eu vou acrescentando as opções vou testando-as e sempre que eu errava dava um erro de RUN-TIME,corrigia e compilava para ver como ficava e eu ia ficando satisfeito.

A última vez que funcionou estava pronto os seguintes MENUs que seus respectivos nomes veem das variáveis públicas a que pertencem:
CADASTROS
Orçamentos - Orçamento
Orçamento simplificado
OSV
Contas a Pagar/ a Receber
Contas a Pagar - Incluir
- Baixar
- Contas

Quando incluí o código e fui testar o Contas a Receber é que deu no que deu
Contas a Receber - Prestações Antigas.


Espero ter ajudado a entender o problema.
DEUS EXISTE!

Define window

Enviado: 27 Jun 2015 11:34
por Toledo
Amigo, seu código não é compilável, isto quer dizer... eu com este código não consigo compilar ele para fazer alguns testes, ficando assim mais complicado de saber onde está o erro. Outra coisa, seu código está com várias linhas comentadas, que acaba confundindo tudo, tornando ainda mais complicado o entendimento do código. Falta saber qual é o conteúdo ou um exemplo das matriz (MENU_H, MENU_CAD, MENU_CADH2, MENU_CADH3, MENU_CON, etc).

Então o primeiro a fazer é excluir o lixo, retirando todas estas linhas comentadas e recompilar o programa novamente... ai se o erro persistir, poste aqui novamente o código mais limpo e completo.

Abraços,

Define window MAIN MENU opções POPUP/ITEM desapareceram

Enviado: 27 Jun 2015 17:48
por microvolution
a pedidos... segue as funções que faltam:

Código: Selecionar todos

     aadd (LINHA,'&Cadastros')
     aadd (BLOCO,{|LIN,COL| MCI10001 (LIN,COL)})
     aadd (H_IND,'MCI10001')
     aadd (MENU_H,{ATAIL(LINHA),ATAIL(BLOCO),ATAIL(H_IND)})
MONTA_VETOR (LINHA,BLOCO,H_IND,'Formatador-1',{|| EXECUTA_PROGRAMA ({|| PCI10998 ()})},'PCI10998','MENU_FOR')
Acima é apenas uma de várias outras idênticas, substituindo-se apenas o nome das variáveis MENU_H, para MENU_CAD, MENU_CADH1, etc...

E, pra completar a função MONTA_VETOR:

Código: Selecionar todos

static function MONTA_VETOR (LINHA,BLOCO,H_IND,PROMPT,ACAO,INDICE,MATRIZ_MENU)
     if E_MASTER () .or. EXISTE_PROGRAMA (INDICE)
          aadd (LINHA,PROMPT)
          aadd (BLOCO,ACAO)
          aadd (H_IND,INDICE)
          aadd (&MATRIZ_MENU.,{ATAIL(LINHA),ATAIL(BLOCO),ATAIL(H_IND)})
return
Prezado Toledo, quanto aos comentários que V.Sa. se refere, sabe muito melhor que eu que eles não interferem na compilação do código fonte, aliás, o interpretador de comandos nem os considera.

Como eu disse, eu fui criando as variáveis públicas, ou melhor, MATRIZes unilaterais para que com qualquer usuário fosse criado no momento do RUN-TIME o MENU de acordo com seus critérios e poderes. Por isso que dentro da função MONTA_VETOR que é chamada sempre que um ITEM do MENU é criado ela verifica através de 2 funções E_MASTER() ou EXISTE_PROGRAMA().
Eu explico:
E_MASTER - essa função retorna se o usuário/senha do LOGADO tem senha MASTER. Se isso for verdadeiro o MENU em questão será montado e liberado. Se essa função não for .T. e sim .F. entra em ação a 2ª chance do usuário com função:
EXISTE_PROGRAMA - essa função já que o usuário não tem SENHA master, verifica se esse programa está liberado pra ele. Se estiver liberado, eu coloco dentro da MATRIZ pública (no exemplo aqui a substituição de &MATRIZ_MENU. pelo seu conteúdo que é MENU_FOR) o nome desse MENU para que o usuário o veja completamente.

Bom, espero ter esclarecido para que V.Sas. me ajudem com esse problema. Apesar que esse problema me parece que é algo intermitente, pois nenhuma opção do MENU aparece.
Abraços!
O REI está voltando!

Define window

Enviado: 27 Jun 2015 19:18
por Toledo
microvolution escreveu:Prezado Toledo, quanto aos comentários que V.Sa. se refere, sabe muito melhor que eu que eles não interferem na compilação do código fonte, aliás, o interpretador de comandos nem os considera.
Toledo escreveu:Outra coisa, seu código está com várias linhas comentadas, que acaba confundindo tudo, tornando ainda mais complicado o entendimento do código.
Amigo, sim, eu sei que estas linhas serão descartadas na compilação, mas como você pode observar nos meu comentários acima, estas linhas acaba complicando o entendimento do código. Se antes de postar o código, você tivesse retirado estas linhas, ficaria mais fácil para interpretar o seu código que por si só já é bem complexo.

Bom, então eu fiz uma cópia do seu código e retirei todas as linhas comentadas, e notei o seguinte:

Entre as linhas 27 e 28 faltou um END POPUP.

Abraços,

Define window HMG 3.0.46

Enviado: 30 Jun 2015 12:04
por microvolution
opa
Toledo escreveu:
Entre as linhas 27 e 28 faltou um END POPUP.
Abraços,
Prezado, mais uma vez obrigado pela ajuda interativa!

Bom, fiz os testes e o MENU POPUP já está quase todo completo. Então, resolvi testar o ACTION de cada função, mas, pude observar que agora estão acontecendo erros que antes não aconteciam no CONSOLE MODE. Eu explico:

Código: Selecionar todos

MONTA_VETOR (LINHA,BLOCO,H_IND,'Formatador-1',{|| EXECUTA_PROGRAMA ({|| PCI10998 ()})},'PCI10998','MENU_FOR')
Bom, de acordo com o código abaixo, essa linha acima era a responsável por no momento do pressionamento do ENTER ou da letra em destaque (TECLA HOTKEY) o programa ou módulo em questão era acionado. E, pra isso um loop usando o INKEY() nós usávamos para que o MENU ficasse esperando o acionamento de alguma tecla. E que fazia esse aguardamento era as linhas abaixo que ficam imediatamente após a linha acima:

Código: Selecionar todos

if len (LINHA) > 0
          OPCAO := MENU_VERTICAL (LIN,COL,LINHA,BLOCO,H_IND,OPCAO)
          restscreen (0,0,maxrow (),maxcol (),S_TEL)
endif
Agora, só falta colocar parte do código da função MENU_VERTICAL, não vou postar todo o código pois é muito grande, mas, vou postar algumas partes e o local do pressionamento do ENTER onde é acionada a função EVAL(). Vejam:

Código: Selecionar todos

function MENU_VERTICAL (LIN1,COL1,ELEM,BLOCO,IND_HELP,INICIO)
     memvar K_HELP,K_UTIL,K_CNS
     local I        := 1,;
           J        := 1,;
           N_PROMPT := len (ELEM),;
           PROMPT   := aclone (ELEM),;
           HOTKEY   := array (len (ELEM)),;
           TECLA    := 1,;
           S_CURSOR := set (_SET_CURSOR),;
           COMPL    := 0
     afill (HOTKEY,'')
     set cursor off
     if LIN1 = 1
          LIN1++
     endif
     FORM_PROMPT (PROMPT)
     COMPL := MAX_ELEM_VETOR (PROMPT)
     COL1 := if (COL1 + COMPL + 1 < 80,COL1,COL1 - (COL1 + COMPL + 1 - 80) - 1)
     MOLDURA (LIN1,COL1,LIN1 + N_PROMPT + 1,COL1 + COMPL + 1,.f.,'')
     COL1++
     for I := 1 to N_PROMPT
          PROMPT [I] := if (at ('~',PROMPT [I]) = 0,padr (PROMPT [I],COMPL),padr (PROMPT [I],COMPL+1))
          ESCR_BAR_NORMAL (LIN1 + I,COL1,PROMPT [I])
          if at ('~',PROMPT [I]) <> 0
               HOTKEY [I] := upper (substr (PROMPT [I],at ('~',PROMPT [I]) + 1,1))
          endif
     next I
     I := if (INICIO <> nil,INICIO,1)
     do while .t.
          ESCR_BAR_DESTAQUE (LIN1 + I,COL1,PROMPT [I])
          TECLA := inkey (0)
          do case
          case TECLA = K_ENTER
               eval (BLOCO [I],LIN1 + I + 1,COL1 + 1)
          case TECLA = K_ESC
               TECLA := I
               exit
          endcase
     enddo
     set (_SET_CURSOR,S_CURSOR)
return TECLA
Bom, de acordo com a função acima (destacamos a matriz BLOCO nas linhas 1 e 34) a função EVAL () aciona a matriz BLOCO que em seguida novamente a MONTA_VETOR que consequentemente executa EXECUTA_PROGRAMA. Vejam:

Código: Selecionar todos

static function EXECUTA_PROGRAMA (PROGRAMA)
         // MINIMIZE WINDOW F2
         // RELEASE  WINDOW F2
     set key TECLA_UTIL to UTIL_PROG
     close all
     eval (PROGRAMA)
     ABRE_ARQ_ACESSO ()
     set key TECLA_HELP to
     set key TECLA_UTIL to
return
Bom, expus todas essas funções, para que V.Sas. nos ajudem a compreender as mensagens de erro que estão aparecendo.
Se eu colocar no modo gráfico dentro da ACTION os seguintes códigos apresentam, respectivamente as mensagens de erro:

EXEMPLO1

Código: Selecionar todos

if len(MENU_CADH2V1)>0
      for CADH2V1=1 to len(MENU_CADH2V1)
          MENUITEM MENU_CADH2V1[CADH2V1,1] ACTION MENU_CADH2V1[CADH2V1,2] // NAME MENU_CAD1[CAD1,3]
      next
endif
MENSAGEM ERRO EXEMPLO1

Código: Selecionar todos

Error BASE/1132 Bound error:array access
called from (b) MCI10000(2232)
...
A linha acima é: exatamente a linha que chama o tal EXECUTA_PROGRAMA() do MONTA_VETOR() que usa o EVAL():

Código: Selecionar todos

MENUITEM MENU_CADH2V1[CADH2V1,1] ACTION MENU_CADH2V1[CADH2V1,2] // NAME MENU_CAD1[CAD1,3]
EXEMPLO2

Código: Selecionar todos

if len(MENU_CADH1)>0
  for CADH1=1 to len(MENU_CADH1)
    MENUITEM MENU_CADH1[CADH1,1] ACTION MENU_CADH2V1[CADH2V1,3] // NAME MENU_CAD1[CAD1,3]
  next
endif
as linhas acima, modifiquei apenas qual posição da matriz é acionada (já postei anteriormente como funcionam esse MENU_CAD(CAD1,3) ou MENU_CAD(CAD1,2)) e mesmo assim apresenta o mesmo erro anterior.

Agora para funcionar sem erros, o único jeito que descobri é no exemplo 3 abaixo. Bom, eu quero entender por que do jeito antigo (MODO CONSOLE funcionava) e agora não mais funciona:

EXEMPLO3

Código: Selecionar todos

if len(MENU_CADH1)>0
  for CADH1=1 to len(MENU_CADH1)
    MENUITEM MENU_CADH1[CADH1,1] ACTION EXECUTA_PROGRAMA2(pci10048()) // NAME MENU_CAD1[CAD1,3]
  next
endif

Código: Selecionar todos

static function EXECUTA_PROGRAMA2 (PROGRAMA)
     MINIMIZE WINDOW F2
     RELEASE  WINDOW F2
     set key TECLA_UTIL to UTIL_PROG
     close all
     PCI10048() // ou &PROGRAMA. (acho que tanto faz, não testei ainda esse exemplo)
     ABRE_ARQ_ACESSO ()
     set key TECLA_HELP to
     set key TECLA_UTIL to
return
Nesse exemplo3, observem que irá funcionar, mas, não é o correto, pois terei que fazer em todos os PRGs que estão em MODO CONSOLE uma pequena alteração.
Outra coisa, mas, dentro do mesmo assunto:
Observem que ao final dessa função EXECUTA_PROGRAMA2, tem set key TECLA_HELP to e TECLA_UTIL to...
percebi que no MODO_GRÁFICO as teclas de função (F1 ao F12) que usava no modo CONSOLE (@ say/get ou inkey) não são acionadas para executar algumas tarefas especiais que eram:
F1 - HELP
F2 - MENU UTILITÁRIOS
F3 - repetir última digitação do campo @SAY/GET
F4 - chama o browse de pesquisa no arquivo
etc etc...

Então, alguém sabe como fazer para isso voltar a funcionar ou ser acionado?

por enquanto é só!
JESUS está voltando, queiram crer ou não, Ele é real e está sentado numa cadeira Real de realeza. Leia a Bíblia Atos 17:30-31

Define window RELEASE

Enviado: 10 Jul 2015 19:25
por microvolution
GENTE, boa noite!
dando continuidade aos trabalhos acima que já estão bem avançados.
Criei uma tela de LOGIN com o seguinte código:

Código: Selecionar todos

        // DEFINE WINDOW FLogin AT 0,0 WIDTH nPicWidth + 50 HEIGHT nPicHeight TITLE "SiCCoSV v4.01 - Tela de Entrada" BACKCOLOR aPicBackColor CHILD NOSYSMENU NOSIZE NOMINIMIZE NOMAXIMIZE ;
        DEFINE WINDOW FLogin AT 0,0 WIDTH nPicWidth + 50 HEIGHT nPicHeight TITLE "SiCCoSV v4.01 - Tela de Entrada" BACKCOLOR aPicBackColor NOSYSMENU NOSIZE NOMINIMIZE NOMAXIMIZE ;
            ON INTERACTIVECLOSE {||NIL};
            ON INIT SetCoords() ON MOUSEDRAG MoveForm() ON MOUSEMOVE SetCoords()
            ON KEY ESCAPE OF FLogin ACTION {||ENCERRA_LOGIN()}
            ON KEY ALT+F4 OF FLogin ACTION {||ENCERRA_LOGIN()}
            @  50,  82 LABEL   lblUserID  VALUE "Usuário:"  TRANSPARENT FONTCOLOR YELLOW BOLD AUTOSIZE
FLogin.txbPasswrd.SetFocus } 
            @  45, 140 TEXTBOX txbUserID  WIDTH 85 HEIGHT 21  FONTCOLOR BLUE BOLD NUMERIC INPUTMASK '999999' ON ENTER { || ConfirmUser()  };
               ON GOTFOCUS  FLogin.lblUserID.FontBold := .T. ;
               ON LOSTFOCUS FLogin.lblUserID.FontBold := .F. 
               
            @  80,  90 LABEL   lblPaswrd  VALUE "Senha:" TRANSPARENT FONTCOLOR YELLOW BOLD AUTOSIZE
            @  75, 140 TEXTBOX txbPasswrd WIDTH 85 HEIGHT 21 FONTCOLOR BLUE BOLD PASSWORD MAXLENGTH 06 ON ENTER { || ConfirmSenha() };
               ON GOTFOCUS  FLogin.lblPaswrd.FontBold := .T. ;
               ON LOSTFOCUS FLogin.lblPaswrd.FontBold := .F. 

            DEFINE TOOLBAR barrasenha OF FLogin BUTTONSIZE 200,40 FONT 'Arial' SIZE 08 FLAT BORDER BOTTOM
               BUTTON btnApply CAPTION '&Ok'      PICTURE BMPCONFIRMA ACTION {||ConfirmUserSenha()} TOOLTIP "Clique aqui para confirmar seu Usuário e Senha e entrar no SiCCoSV!" SEPARATOR 
               BUTTON cancela  CAPTION '&Cancela' PICTURE BMPCANCELA  ACTION {||ENCERRA_LOGIN()}    TOOLTIP "Cancela a entrada no SiCCoSV!"                                                   END TOOLBAR
        END WINDOW  // FLogin

        FLogin.Cursor := "DragCurs"
        FLogin.Center()
        FLogin.Activate()

   ELSE
        MsgStop( cPictFNm + " Faltado Arquivos de Imagens! O sistema será abortado !", "ERROR 8 - SiCCoSV" )
   ENDIF

RETURN // PERMITIU // CheckUser()     
Bom, a primeira linha está comentada, pois eis o problema.
Ela é semelhante à segunda, mas com 2 diferenças que testei e vc também pode fazer o teste:
1 - No lugar de ser CHILD não coloquei nada para que fosse STANDARD.
2 - Se colocar MODAL dá uma série de erros.

Bom, mas, se o problema fosse só esse estava tudo OK, mas, não o problema é bem maior.
Antes de fazer o login eu crio o FORM principal como MAIN sem o POPUP MENU e ITEMSOURCE/ITEMS. Coloco ele em HIDE e MINIMIZE (estou falando do formulário principal MAIN). Somente depois de uns 3 formulários e várias etapas que eu MAXIMIZO.
Então antes dessa etapa de maximização do FORM PRINCIPAL (WINDOW MAIN) uma delas é a criação da tela de SPLASH, depois o LOGIN depois a tela que verifica se o aplicativo é definitivo ou apenas demonstrativo, depois ainda a tela de configuração de dados com o usuário que efetuou o LOGIN.

Depois desses processos todos e fechamento de todas telas, eu dou um MAXIMIZE no formulário WINDOW MAIN (aqui chamado de F1.MAXIMIZE) é que vem o problema que comecei a expor através do código acima.

Não sei o que é, mas, o formulário do LOGIN abre novamente e ficam os 2 formulários em aberto, conforme imagem logo abaixo:
MAIN E LOGIN.JPG
Como viram acima, tanto o MENU principal (FORM WINDOW MAIN) como o LOGIN (formulário CHILD ou não fica junto. E, se eu o fechar ele fecha todo o programa).
Já revisei todo o código e nos caminhos que percorre o sistema, através de uma coisa simples, que é: a cada função que o sistema entra e no final dela eu coloco o código:

Código: Selecionar todos

? 'início da função'
wait
? 'fim da função'
wait
Com o código acima eu DEBUGei todos os caminhos percorridos para tirar a dúvida se em algum momento eu chamo o formulário de LOGIN novamente.
Mas, percebi que não é isso. Então, imagino o seguinte:
O formulário login não está pegando o RELEASE (se é que esse é o comando/função para fechar definitivamente um formulário), mesmo ele sendo claro no sistema, pois quando se faz o login ele some da tela.
O código de fechamento do formulário LOGIN é:

Código: Selecionar todos

PROCEDURE ConfirmSenha()
    STATIC nAttempt := 0
    LOCAL n2Right, n2Left, nRepeat
    LOCAL nColumn, nStep
    LOCAL cUserID   := FLogin.txbUserID.Value,;
          cPassword := padr (alltrim (upper(FLogin.txbPasswrd.Value)),6), mPASSWORD := space (6)
          // padr (alltrim (upper(cPassWord)),6)
    if .not. fUSUA (cUserID)
      MsgStop ('Usuário Não Cadastrado. Tente Novamente','SiCCoSV')
      lConfirmed := .f.
      return lConfirmed
    endif
    mPASSWORD := padr (alltrim (upper(cPassWord)),6)
    PERMITIU  := CRIPTOGRAFA (mPASSWORD) == PASSWORD
    set key K_F4 to
    set cursor off
    if (PERMITIU) .and. (lastkey () <> K_ESC)
        COD_ACESSO := mCOD_USU := cUserID
        lConfirmed := .T.
        FLogin.HIde
        // FLogin.Release // substituí essa linha pela abaixo, por pensar que aqui era o problema.
        ThisWindow.Release
    ELSE
        MsgStop( "Senha Inválida. Tente Novamente!", "Acesso ao Sistema" )
    ENDIF
RETURN lConfirmed // ConfirmUser()
Então se os colegas observarem aparentemente está tudo correto, mas, como vimos o formulário LOGIN volta novamente.

O que os colegas podem me ajudar a esclarecer sobre o funcionamento de DEFINE WINDOW?