Newsgroup: it.comp.lang.delphi
Titolo: Passare a delphi. Consigli e domande

Salve a tutti.
Questo è il mio primo post su questo gruppo.
Sono un programmatore (amatoriale) di vb (soprattutto vba excel e access 2003).
Vorrei iniziare con un nuovo linguaggio e guardando un po' in giro e sentendo un po' di consigli di amici, sono arrivato alla conclusione che quello giusto è proprio delphi. 
Cosi' ho scaricato l'ultima versione di delphi XE3 (e per 30 giorni posso provarla).
Avrei pensato come prima base per imparare, cercare di riscrivere un breve programma (attualmente in vba access) in delphi.
 
Ed eccomi alle prime domande:
avro' necessita' di gestire interamente un file excel (creare,aprire,leggere e scrivere in celle definite e fogli definiti, con range ecc, ecc) e un file word (creare, aprire, leggere, scrivere, impostare intestazione e pie' di pagina, ecc).
 
In delphi ci sono librerie native con cui si puo' fare questo ? Occorre utilizzare librerie esterne ? Ce ne sono di gratuite ? Dove potrei cercare un po' di materiale ?
 
Grazie

 pie' di pagina, ecc).
 
Cio' che hai decritto si chiama OLE AUTOMATION, e questa cosa PRESCINDE da delphi.
Ci sono in giro prodotti per, come dire, semplificarsi la vita, ma in genere sono legati a specifiche versioni di excel o word.
Andando direttamente via OLE AUTOMATION usi vba grosso modo come dovresi essere abituato ad usarlo.
Il prezzo da pagare è che lavori in LATE BINDING, cioe', eventuali errori saltano fuori a runtime e non in fase di compilazione.
Se cerchi in giro "delphi ole automation" troverai una marea di link, articoli e cosi via.
 
Pero, se fornisci qlc dettaglio in piu' di quello che fa la tua app magari potresti scoprire che con delphi puoi fare di piu' e meglio per il tuo specifico contesto.
 
A.


Innanzitutto ti ringrazio per la risposta immediata. Devo ammettere che intraprendere questo nuovo "cammino" mi preoccupa un po' .... ma comunque, anche se non sono un "giovincello", con la volonta' ed il vostro aiuto spero di farcela.
 
Ti posto un paio di routine del mio prg, giusto per dare l'idea di quello che devo ricreare:
 
------------------------------------------------------------------------------
 
Public Function comp_i4()
On Error GoTo i4_err
 
'evidenzio il tab relativo
TabCtl100.Value = 2
 
ic = ""
If tipo_attivita = "I" Then
   ic = "I4"
Else
   ic = "A6"
End If
 
Set objWorksheet = objWorkbook.Worksheets(ic)
objWorkbook.Worksheets(ic).Select
If i4neg = True Then
  If tipo_attivita = "I" Then
      objWorksheet.Cells(47, 2).Value = "N E G A T I V O"
  Else
      objWorksheet.Cells(38, 2).Value = "N E G A T I V O"
End If
comp_i4 = True
Exit Function
End If
 
filedacercare = ""
filedacercare = (Trim(Testo99.Value & "")) + "\" + (Trim(tab4.Value & ""))
If Len(Trim(tab4.Value & "")) <> 0 And FileEsiste3(filedacercare) = True Then
  Close #4
  Open Trim(filedacercare) For Input As #4
  ri4 = 0
   If tipo_attivita = "I" Then
     riga = 10
   Else
     riga = 12
   End If
   Do While Not EOF(4)
   ri4 = ri4 + 1
    Line Input #4, RigaTesto
   ' se compreso nell'intervallo è ok
    If ri4 >= rig4in And ri4 <= rig4fi Then
   ' finito
    If (InStr(RigaTesto, "T O T A L E") <> 0) Then
       comp_i4 = True
       GoTo uscita4
    End If
   ' E' una riga che interessa
   If Mid(RigaTesto, 26, 4) = "1234" Then
      riga = riga + 1
      ' Ho superato le righe disponibili !!
       If riga > 33 Then
        MsgBox "Attenzione !! Non posso più scrivere righe sul foglio 4.", vbCritical
        comp_i4 = False
        Exit Function
       End If
    ' estraggo i dati 1
     objWorksheet.Cells(riga, 2).Font.Size = 9
     objWorksheet.Cells(riga, 2).HorizontalAlignment = xlCenter
     objWorksheet.Cells(riga, 2).Value = Mid(RigaTesto, 37, 11)
    ' estraggo i dati 2
     objWorksheet.Cells(riga, 3).Font.Size = 9
     objWorksheet.Cells(riga, 3).HorizontalAlignment = xlRight
     objWorksheet.Cells(riga, 3).Value = Mid(RigaTesto, 12, 8)
    ' estraggo i dati 3
     If Len(Trim(Mid(RigaTesto, 72, 11))) <> 0 Then
       objWorksheet.Cells(riga, 5).Font.Size = 9
       objWorksheet.Cells(riga, 5).HorizontalAlignment = xlRight
       objWorksheet.Cells(riga, 5).Value = CDbl(Mid(RigaTesto, 72, 12))
     Else
       objWorksheet.Cells(riga, 5).Font.Size = 9
       objWorksheet.Cells(riga, 5).HorizontalAlignment = xlRight
       objWorksheet.Cells(riga, 5).Value = 0
     End If
     Line Input #4, RigaTesto
     ' intestazione
     objWorksheet.Cells(riga, 4).Font.Size = 9
     objWorksheet.Cells(riga, 4).HorizontalAlignment = xlLeft
     objWorksheet.Cells(riga, 4).Value = Mid(RigaTesto, 3, 25)
     ' data 
     if Len(Trim(Mid(RigaTesto, 60, 10))) <> 0 Then
        objWorksheet.Cells(riga, 1).Font.Size = 9
        objWorksheet.Cells(riga, 1).HorizontalAlignment = xlCenter
        objWorksheet.Cells(riga, 1).NumberFormat = "dd/mm/yy;@"
        objWorksheet.Cells(riga, 1).Value = CDate(Mid(RigaTesto, 60, 10))
     End If
End If
End If
Loop
comp_i4 = True
End If
 
uscita4:
If tipo_attivita = "I" Then
    If riga = 10 Then
        objWorksheet.Cells(47, 2).Value = "N E G A T I V O"
        comp_i4 = True
        Exit Function
    End If
Else
    If riga = 12 Then
        objWorksheet.Cells(38, 2).Value = "N E G A T I V O"
        comp_i4 = True
        Exit Function
    End If
End If
 
Exit Function
 
i4_err:
MsgBox Err.Number & Err.Description
comp_i4 = False
Call chiudi_excel
Set appExcel = Nothing
Exit Function
End Function
 
 
------------------------------------------------------------------------------
 
scrivi_ga234:
If t3neg = True Then
' file TXT esiste ma non ci sono dati dentro
    nomefiletab = ""
    nomefiletab = (Trim(Testo99.Value & "")) + "\" + Right("000" + Trim(CasellaCombinata34), 3) + "_G4.DOC"
 
    objWord.Documents.Add
    objWord.Visible = False
 
 
objWord.Selection.Font.Name
 = "Courier New"
    objWord.Selection.Font.Size = 8
    objWord.Selection.PageSetup.Orientation = wdOrientLandscape
 
    ' non controlla gli errori ortografici
    objWord.Options.CheckGrammarAsYouType = False
    objWord.ActiveDocument.ShowGrammaticalErrors = False
 
    ' intestazione di pagina
    objWord.ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
    objWord.Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
 
objWord.Selection.Font.Name
 = "Courier New"
    objWord.Selection.Font.Size = 7
    objWord.Selection.Font.Bold = True
    objWord.Selection.TypeText Text:="Estrazione del " & Testo188.Value 
    objWord.ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
 
    objWord.Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
 
objWord.Selection.Font.Name
 = "Courier New"
    objWord.Selection.Font.Size = 14
    objWord.Selection.Font.Bold = True
 
    objWord.Selection.TypeText Text:=Chr(13)
    objWord.Selection.TypeText Text:=Chr(13)
    objWord.Selection.TypeText Text:=Chr(13)
    If Len(Trim(datacreazione)) <> 0 Then
        objWord.Selection.TypeText Text:="N E S S U N  dato presente all'interno del tabulato "
        objWord.Selection.TypeText Text:=Chr(13)
        objWord.Selection.TypeText Text:=(Trim(tabst3)) & "(" & tipotab3.Caption & ") del " & datacreazione
        objWord.Selection.TypeText Text:=Chr(13)
    Else
        objWord.Selection.TypeText Text:="N E S S U N  dato presente all'interno del tabulato "
        objWord.Selection.TypeText Text:=Chr(13)
        objWord.Selection.TypeText Text:=(Trim(tabst3)) & "(" & tipotab3.Caption & ") "
        objWord.Selection.TypeText Text:=Chr(13)
    End If
    objWord.Selection.Font.Size = 16
    objWord.Selection.TypeText Text:="( N E G A T I V O )"
    objWord.Selection.TypeParagraph
    objWord.ActiveDocument.SaveAs nomefiletab
    objWord.ActiveDocument.Close
 
    objWord.Quit SaveChanges:=wdDoNotSaveChanges
    Close #4
    test_g4 = 2
    Exit Function
End If
 
 
-----------------------------------------------------------------------------
 
 
'******************************************************
' STAMPA G4
'******************************************************
nomefiletab = Trim(Testo99.Value) & "\" & Right("000" + Trim(CasellaCombinata34), 3) & "_G4.DOC"
If tabst3co <> 0 Then
    If Dir(nomefiletab) <> "" Then
        Set objWord = New Word.Application
        objWord.Visible = False
            For nco = 1 To Val(tabst3co)
                If nco = 1 Then
                    If tipo_attivita = "I" Then
                        piepag = ""
                        piepag = "Tabulato G4 (estratto da G4.TXT) - Allegato 3"
                    Else
                        piepag = ""
                        piepag = "Tabulato G4 (estratto da G4.TXT) - Allegato 1"
                    End If
                ElseIf nco = 2 Then
                    If tipo_attivita = "I" Then
                        piepag = ""
                        piepag = "Tabulato G4 (estratto da G4.TXT) - Allegato 5"
                    Else
                        piepag = ""
                        piepag = "Tabulato G4 (estratto da G4.TXT) - Allegato 2"
                    End If
                Else
                    piepag = ""
                    piepag = "Tabulato G4 (estratto da G4.TXT)"
                End If
 
                Set wDoc = objWord.Documents.Open(nomefiletab, AddToRecentFiles:=False)
                With wDoc
                    With .Sections.First.Footers(wdHeaderFooterPrimary).Range
                        'cancella il pie' di pagina vecchio & aggiunge il pie' di pagina nuovo
                        .Text = piepag
                        .ParagraphFormat.Alignment = wdAlignParagraphRight
                            With .Font
                            .Name = "Courier New"
                            .Size = 7
                            .Bold = True
                            End With
                    End With
                    ' stampa il documento
                    .PrintOut Range:=wdPrintAllDocument
                    .Close SaveChanges:=wdDoNotSaveChanges
                End With
            Next nco
        objWord.Quit
        Set wDoc = Nothing
        Set objWord = Nothing
        S3OK.Visible = True
    Else
        t(2, 1) = "NO"
    End If
Else
        t(2, 1) = "NO"
End If
 
 
-----------------------------------------------------------------------------
 
Public Function chiudi_excel()
 
If IsProcessRunning("EXCEL.EXE") Then
 
    On Error Resume Next
    Shell "CMD /C TASKKILL /IM EXCEL.EXE /F"
    On Error GoTo 0
    Do
        If Not IsProcessRunning("EXCEL.EXE") Then Exit Do
        DoEvents: If Timer > (myT2 + 2) Or Timer < myT2 Then Exit Do
    Loop
 
End If
End Function
 
-----------------------------------------------------------------------------
 
 
con varie varianti, quello che faccio, fondamentalmente, e' 
1) leggere un file txt (ovviamente dopo aver controllato che esiste, ecc, ecc)
2) estrarne dei dati
3) scriverli in vari fogli di un file xls
4) leggere sempre lo stesso file txt
5) estrarre le righe che soddisfano alcune condizioni
6) creare dei file DOC con relativa intestazione 
7) stampare i doc creati inserendo pie' di pagina diversi (per lo stesso tabulato) in base ad alcune condizioni.
 
Come dicevo all'inizio, pensavo che esistesse qualche dll che richiamata da delphi permettesse la gestione completa di file xls e doc, ma va bene qualsiasi altra soluzioni che mi permetta di ottenere il risultato.
Non appena avro' tutte le informazioni necessarie, potro' incominciare a scrivere qualche riga .....
 
Grazie in anticipo.
 
K.

L'indicazione l'hai gia' ricevuta: OLE AUTOMATION.
Da qui google rulez.
 
Riguardo il codice che hai postato speiga COSA fai.
Io intendevo info sul PERCHE' lo fai.
Quale è il target o il problema che la tua app risolve?
 
A.


Innanzitutto grazie.
Avevo capito che l'OLE era la strada, ma dalla tua risposta avevo intuito che ci sarebbe potuto essere una via "migliore".
 
Il PERCHE' e': automatizzare operazioni ripetitive e manuali: evitare che l'utente debba stampare una serie di tablati e ricopiarne il contenuto su fogli excel, che una volta compilati, servono per compilare dei file word.
 
Grazie

 Il PERCHE' e': automatizzare operazioni ripetitive e manuali: evitare che l'utente debba stampare una serie di tablati e ricopiarne il contenuto su fogli excel, che una volta compilati, servono per compilare dei file word.
 
Si d'accordo, ma è proprio indispensabile generare i file excel e word? 
Spiega questo. Un pdf al posto di word, ad es, non andrebbe bene?
 
In cosa consiste l'elaborazione che eventualmente viene fatta con il 
file excel? Non si può risolvere scrivendo la logica in delphi con un 
database?
 
Se non ci fai capire queste cose è difficile aiutare.
 
 
 
 
-- 
Mai mettersi a discutere con un idiota:
- prima ti porta al suo livello e poi ti batte con l'esperienza;
- chi ascolta potrebbe non capire la differenza.
 


Eccomi qua, cerco di spiegare:
l'elaborazione prevede la creazione di un file word (per me è stata la soluzione più breve da seguire) perche' ho un file TXT generato in automatico da una procedura esterna dove sono presenti una serie di dati raggruppati per codice prodotto. In una prima fase provvedo a leggere il file TXT e definisco riga di inizio e di fine del prodotto da elaborare (ri4in, ri4fi).
Quindi leggo i dati dal file e li scrivo sul file excel (e questo devo farlo per forza in quanto questo foglio di lavoro serve, come detto, per calcolare dei dati (somme ecc ecc) sull'ultimo foglio della cartella stessa.
 
Poi,dovendo stampare anche i prodotti selezionati sul file TXT, ho creato dei file DOC che poi mando in stampa. Questo processo potrebbe essere sostituito dalla creazione di file PDF, purche' (come evidenziato nel codice che ho postato) abbia la possibilita' di inserire delle intestazioni di pagina noncheè dei piè di pagina che devono essere diversi per copie del tabulato (per esmepio tabulato x, copia 1 pie' di pagina pie1, tabulato x, copia 2 pie' di pagina pie2)
 
Spero di essermi spiegato .
 
Grazie 


E se ti vengono cambiati (spostati, cancellati, distrutti, rovinati, 
sostituiti con altri con lo stesso nome), a tua insaputa, i file di 
Excel (perdendo le formule che fanno i calcoli perché, magari, 
sovrascritte con dati fissi) e di Word?
 
Se usi, invece, report interni alla tua applicazione Delphi non dai al 
cliente nessuna possibilità di personalizzazione, certo, ma nemmeno egli 
può cambiarti i documenti e poi lamentarsi con te dicendoti che non 
stampa quello che si aspetta.
 
Ti do una brutta notizia, ma forse te l'aspettavi già.
 
Prima o poi dovrai abbandonare Excel e rivolgerti ad un database fatto 
come si deve.
 
No, non è Access. :)
 
-- 
@WarpTen10


Gia' gia' ... e' una possibilita' a cui piu' volte ho pensato.
 
Il passaggio a delphi, in un secondo momento (dopo aver imparati e preso padronanza) prevede, nella mia testa la creazione di un database in cui memorizzo le informazioni lette e, in seguito, la "creazione ex novo" del foglio excel in cui vado a creare i singoli fogli con le relative formule cosi' da non incorrere in quel problema. (putroppo il file excel deve esserci per forza, in quanto un altra procedura, non creata da me, ne fa uso "intenso" ...
 
Grazie

 No, non è Access. :)
 
Definire access è un database è un ossimoro come "politico onesto".
Dire che è "come si deve" è cosa da delirio.
 
A.

 Dire che � "come si deve" � cosa da delirio.
 
Access � un nome che non sentivo pi� da tanto tempo... tanto tempo.
Non uso pi� Access da... oh, da prima che tu nascessi.
 
:)
 
-- 
@WarpTen10

 :)
 
LOL. e invece c'e' ancora chi lo usa! Da un paio di anni dobbiamo
connetterci ad un Db esterno di una ditta con cui collaboriamo.
E' un DB access. Ho pensato che fosse una scelta dettata da ragioni
di compatibilita' col passato, invece no: l'applicazione e' nata
da pochi anni. E se non ho capito male, adesso vogliono anche 
farla andare in rete!!!
 
ciao
Giacomo
 
 

 farla andare in rete!!!
 
 
...contenti loro.....
 
A.

 LOL. e invece c'e' ancora chi lo usa!
 
Sto cercando di convertire (riscrivere da zero) un'applicazione fatta in 
non-so-cosa (non č VB, ma forse č anche peggio) che s'appoggia non ad 
uno ma a due db Access nei quali le informazioni sono raddoppiate.
 
Un cliente in un db e lo stesso cliente nell'altro db hanno codici 
diversi, tanto per fare un esempio.
 
 
-- 
@WarpTen10

 @WarpTen10
 

 Se poi uno fa cose del genere "xche cosi ho pensato".
 
Ho un'amica psichiatra che cerca casi rari. Glieli posso presentare.
 
-- 
@WarpTen10

> Ho un'amica psichiatra che cerca casi rari. Glieli posso presentare.
 
..magari fossero rari! :-|
 
A.