eu utilizo uma tela padrão para gerenciar os relatórios ... segue abaixo o código do botão de confirmação da impressão do relatório na tela padrão ...
Dim i As Integer, k As String, vghWnd As Long
With mdiADVANCED.crwRelat 'com o crontrole do crystal
.Destination = txtDestRel(0).Value 'saída do relatorio (janela, papel, arquivo)
On Error GoTo ErroCrystal 'prepara para pegar erro
If .Destination = 1 Then 'se vai para impressora...
.CopiesToPrinter = Val(txtCopias.Text) 'número de cópias configurada no diálogo
ElseIf .Destination = 2 Then 'se vai para arquivo
k$ = txtArquivo.Text 'pega o nome do arquivo
If Existe(k$) And Len(k$) > 0 Then 'se já existir,
Beep 'pede confirmação para gravar por cima
If MsgBox(LoadResString(8740), vbQuestion + _
vbDefaultButton1 + vbYesNo, vgAtencao$) = vbYes Then
Kill k$ 'se o usuário deixou, mata!
Else 'senão
Exit Sub 'sai desta rotina
End If
End If
.PrintFileName = txtArquivo.Text 'diz ao cristal qual o nome do arquivo
.PrintFileType = txtTipoArquivo(txtTipoArquivo(0).Value).BookMark 'e o formato da exportação
End If
.WindowTitle = vgTitulo$ 'título da janela
.ReportFileName = vgDirEXE$ + vgNomeRel$ + ".RPT" 'e o nome do relatório a ser impresso
.DataFiles(0) = vgDirDb$ + vgNomeDb$ 'diz ao cristal o nome do BD
k$ = vgFiltroInicial 'filtro inicial (do projetista)
If Len(vgUltimoFiltro$) > 0 Then 'o usuario fez filtro
If Len(k$) Then k$ = k$ + " AND " 'coloca conector se necessario
k$ = k$ + vgUltimoFiltro 'e junta os dois filtros
End If
.SelectionFormula = k$ 'passa para o crystal
.Action = 1 'invoca a ação 1 - imprime
If .Destination = 0 Then 'se vai para janela
vghWnd = ProcuraWindow(vgTitulo$) 'pega o handle da janela do crystal
If vghWnd <> 0 Then
SetWindowWord vghWnd, W_HPARENT, mdiADVANCED.hWnd 'para coloca-lo sempre por cima
End If
ElseIf .Destination = 1 Then 'se enviou para papel,
Unload Me 'podemos descarregar o form
End If
End With
Exit Sub 'fora da função
ErroCrystal: 'se caiu aqui,
Select Case Err 'deu alguma coisa errada...
Case 20507, 20514 'nome inválido
k$ = LoadResString(8710) 'prepara a mensagem
Case 20526 'impressora default ilegal
k$ = LoadResString(8715) 'prepara a mensagem
Case 20504 'relatório não encontrado
k$ = LoadResString(8720) + " (" + vgNomeRel$ + ")" 'prepara mensagem
Case Else 'erro indeterminado
k$ = LoadResString(8730) 'prepara a mensagem
End Select
Beep 'beepa,
MsgBox k$, vbCritical, vgAtencao$ 'apresenta a mensagem e