Newsgroup: it.comp.lang.delphi
Titolo: [D5][WIN 2K] Invio Fax con Delpi

Salve a tutti,
ho l'esigenza di inviare alcuni fax in sequenza, tramite una mia
applicazione.
Ho letto a fondo nei gruppi di google come fare, ma la sola soluzione che ho
trovato è quella di utilizzare Microsoft Fax, come stampante, ma ad ogni
operazione compare una maschera di dialogo in cui chiede il numero di fax.
So che è possibile inviare il numero come parametro, ma non so come fare.
Sono grato a tutti coloro che mi risponderanno, anche se è periodo di ferie!
Ciao,
Davide

> So che è possibile inviare il numero come parametro, ma non so come fare.
Presumo tu vada via OLE.
Puoi postare il codice?
A

 il numero di fax.
[cut]
Hai visto questa pagina:
http://msdn.microsoft.com/msdnmag/issues/01/08/FaxServ/default.aspx
Se riesci a fare qualche cosa, puoi postare il codice qui?
Grazie.
-- 
I'am what I'am, I do what I can


Ci sarebbe anche Asyncpro di turbopower, libreria che ora è diventata open
source,
che permette di inviare e ricevere fax se non vado errato.
Ciao,
MM

 Puoi postare il codice?
Allora, dopo un po' di lavoro e tentativi, queste sono le cose che ho
prodotto, sia dal punto di vista di configurazione, che dal punto di vista
della programmazione:
1) Ho installato il componente: "Fax Server" standard di win xp pro (presumo
che in Win 2k non sia tanto differente)
2) Ho installato la stampante "Fax" selezionando :
        impostazione | Sampanti e Fax
        Dal menu File | Imposta Stampante FAX Locale
3) Ora tutto e pronto per scrivere il programma, cosi ho fatto le seguenti
cose (Banalissime):
        a) Una form con un bottone (button1), un memo box(Memo1), un oggetto
TQuickRep(Rep1) con DetailBand e una label(Label1).
        b) Rep1BeforePrint ho scritto:
            procedure TForm1.Rep1BeforePrint(Sender: TCustomQuickRep;var
PrintReport: Boolean);
            begin
              Label1.Caption := Memo1.Text;
            end;
        c) In Button1Click
            procedure TForm1.Button1Click(Sender: TObject);
            begin
              Rep1.PrinterSetup;
              Rep1.Print;
            end;
Questa soluzione spartanissima, ma funzionante, comporta di dover inserire
il numero a cui inviare il fax, io vorrei sia selezionare in automatico la
stampante Fax, che passarle come parametro il numero di telefono.
Come faccio? Grazie mille a tutti quanti!
Davide

Grazie a tutti coloro che mi hanno risposto....
Spero che qualcuno stia ancora seguendo questo thread...
Fino ad ora non sono riuscito a fare moltissimo, usando componenti Report
Builder sono riuscito a utilizzare la stampante FAX, chiamandola per nome,
in questo modo:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Rep1.PrinterSetup.PrinterName  := 'Fax';  //
<--------------------
      Rep1.Print;
    end;
Ho poi letto l'articolo in inglese alla pagina :
 
http://msdn.microsoft.com/msdnmag/issues/01/08/FaxServ/default.aspx
Ed in sintesi diche (Correggetemi se sbaglio) che ci sono due modi con win
2k per programmare il fax server, uno tramite COM Automation e l'altro
tramite le standard C API.
Il primo sistema, che sembra anche il piu semplice, riporta un esempio in
Visual Basic, che vi mostro:
    Sub SendDocByFax()
        Dim FaxServer As Object
        Dim FaxDoc As Object
        'Create FaxServer object...
        Set FaxServer = CreateObject("FaxServer.FaxServer")
        '...and connect to it - no empty name allowed
        FaxServer.Connect ("mycomputer")
        'Create document
        Set FaxDoc = FaxServer.CreateDocument("d:\documents\mydoc.doc")
        FaxDoc.FaxNumber = "+99 (99) 999999"
        FaxDoc.RecipientName = "John Doe"
        FaxDoc.Send
        Set FaxDoc = Nothing
        FaxServer.Disconnect
        Set FaxServer = Nothing
    End Sub
Dire che e semplice e limitativo pero all'uso di visualbasic, direi, perche
come cavolo lo posso tradurre in delphi?
Posso dichiarare anche io un oggetto di tipo "FaxServer"? Ma come? Il suo
utilizzo penso che poi sarebbe semplice(o forse sono troppo ottimista)!
Spero vivamente di trovare qualche anima pia in grado di aiutarmi,
Davide Gurgone.

 ottimista)!
Devi semplicemente tradurlo in Delphi.
uses ComObj;
procedure TForm2.ButtonClick(Sender: TObject);
var
  Fax: Variant;
begin
  Fax := CreateOleObject('FaxServer.FaxServer');
  Fax := Unassigned;
end;
Saluti.


 come cavolo lo posso tradurre in delphi?
Ciao,
te l'ho tradotto, sperando ti funzioni. Non l'ho provato, ci sarà
sicuramente qualche errore... cmq hai capito il gioco ormai.
Ciao
Giuseppe
***
Uses comobj,activex;
Procedure SendDocByFax;
var
FaxServer: OleVariant;
FaxDoc: OleVariant;
begin
//       'Create FaxServer object...
FaxServer := CreateOleObject('FaxServer.FaxServer');
//        '...and connect to it - no empty name allowed
FaxServer.Connect ('mycomputer');
//        'Create document
FaxDoc = FaxServer.CreateDocument('d:\documents\mydoc.doc');
FaxDoc.FaxNumber := '+99 (99) 999999';
FaxDoc.RecipientName := 'John Doe';
FaxDoc.Send;
FaxServer.Disconnect;
end;
begin
coinitialize(Nil);
SendDocByFax;
end.

Ringrazio tutti per avermi aiutato a risolvere il problema, mi sembra giusto
ora postarla!
1) Installare il servizio fax di Windovs 2000 o XP
2) Installare la stampante Fax in:
        Start | Impostazioni | Stampanti e FAX
        poi nella finestra: File|Imposta Stampante FAX (o simile, ho il SO
in inglese)
3) Scrivere Programma usando gli oggetti Ole:
        uses ComObj;
        procedure TForm1.Button1Click(Sender: TObject);
        var
          Fax,FaxDoc: Variant;
        begin
          Fax := CreateOleObject('FaxServer.FaxServer');
          Fax.Connect('davide'); // il nome del PC che mette a disposizione
il servizio FAX,
                                              // in questo caso il mio PC
          FaxDoc := Fax.CreateDocument('c:\pp.doc');
          FaxDoc.FaxNumber     :='0254787458';
          FaxDoc.RecipientName := 'Davide'; // ho messo un nome a caso
          FaxDoc.Send;
          Fax.Disconnect;
        end;
Grazie ancora a tutti e buon lavoro,
Davide Gurgone

 ha scritto nel messaggio
news:ai43b.3364$d66....@news2.tin.it...


 A che serve la stampante?
Serve perche' il servizio fax utilizza COM e la stampante per imnviare
via fax tutti gli oggetti stampabili via shell.


 serve la stampante?
La stampante trasforma il documento prodotto in un'immagine formato TIFF G3.
Un po' come il PDF Writer.
Se vuoi crearti l'immagine tu, senza stampante ne server, devi usare le C
API.
Poi pero devi gestirti tutto quanto, se il fax arriva o no, se non arriva
rimandarlo... invece in questo modo fa tutto il server, riempie una cartella
di un programmino tipo outlook express e se l'invio non va a buon fine, lo
ritenta un certo numero di volte da settare!
Comodo!
Ti mando comunque il codice per la gestione delle C API:
Ciao,
Davide
Figure 7 Sending a File void CFaxTestDlg::SendDocument()
{
   HANDLE               fxHandle;
   PFAX_JOB_PARAM       pfxParam;
   PFAX_COVERPAGE_INFO  pcpInfo;
   DWORD                dwJobId;
   LPCTSTR              pszServerName = NULL;
   // If server name is empty - assume null i.e. local server
   if ( !m_strServerName.IsEmpty() )
      pszServerName = m_strServerName;
   // Connect to the fax server
   if ( !FaxConnectFaxServer(pszServerName, &fxHandle) )
   {
      ReportOSError();
      return;
   }
   // Prepare and allocate job params and cover page data
   if ( FaxCompleteJobParams( &pfxParam, &pcpInfo ) )
   {
      ReportOSError();
      FaxClose(fxHandle);
      return;
   }
   // Display property sheet and gather all recipient and sender info
   CFaxParamsSheet   fps(pfxParam, pcpInfo, m_bUseCoverPage);
   // If succeeded send it
   if ( fps.DoModal() != IDCANCEL )
   {
      // Free cover page info if not needed
      if ( !m_bUseCoverPage )
      {
         FaxFreeBuffer(pcpInfo);
         pcpInfo = NULL;
      }
      // Try to send
      if( FaxSendDocument( fxHandle, m_strFileName, pfxParam, pcpInfo,
          &dwJobId ) )
         AfxMessageBox("SendDoc succeeded");
      else
         ReportOSError();
   }
   // Cleanup here
   FaxFreeBuffer(pfxParam);
   if ( pcpInfo )
      FaxFreeBuffer(pcpInfo);
   FaxClose(fxHandle);
}
Figure 8 Controlling Fax Printing
void CFaxTestDlg::PrintText()
{   FAX_COVERPAGE_INFO   cpInfo;   FAX_PRINT_INFO       fpInfo;
   FAX_CONTEXT_INFO     fcInfo;   CDC                  fxDC;
   CSize                sz;   CRect                rPage;
   LPCTSTR              pszPrinterName = NULL;   DWORD
dwJobId;
   // If printer name is empty - assume local printer
   if ( !m_strPrinter.IsEmpty() )      pszPrinterName = m_strPrinter;
   // Prepare structures   ZeroMemory(&cpInfo,sizeof(FAX_COVERPAGE_INFO));
   ZeroMemory(&fpInfo,sizeof(FAX_PRINT_INFO));
   cpInfo.SizeOfStruct = sizeof(FAX_COVERPAGE_INFO);
   fpInfo.SizeOfStruct = sizeof(FAX_PRINT_INFO);
   // Collect the recipient info and cover page information
   CFxPrintInfoSheet fpiSheet(&fpInfo, &cpInfo, m_bUseCoverPage);
   if ( fpiSheet.DoModal() == IDCANCEL )      return;
   // Get the printer context   if ( FaxStartPrintJob( pszPrinterName,
                          &fpInfo,                          &dwJobId,
                          &fcInfo ) )   {      ReportOSError();
   return;   }
   // Attach HDC to CDC so it is released no matter what happens
   VERIFY(fxDC.Attach(fcInfo.hDC));   // Print the cover page if needed
   if ( m_bUseCoverPage )   {      if ( FaxPrintCoverPage(&fcInfo,
&cpInfo) )
      {         ReportOSError();         return;      }   }
   // Get client rectangle   CRect   rClient(0,                    0,
                   fxDC.GetDeviceCaps(HORZRES),
                   fxDC.GetDeviceCaps(VERTRES));   fxDC.StartPage();
   // And draw the text
   fxDC.DrawText(m_strFaxText, &rClient, DT_LEFT | DT_WORDBREAK );
   fxDC.EndPage();   fxDC.EndDoc();   fxDC.DeleteDC();}
Grazie ancora per l'aiuto!
Ciao!