Aprire un file pdf da una canvas

Salve ragazzi.

Mi rivolgo a gente piu’ esperta per la soluzione del seguente problema:

Ho un file pdf in una canvas e forrei aprirlo con un pdf viewer qualsiasi facendo click su di essa.
Domanda:
E’ possibile farlo e si come?

Ringrazio tutti anticipatamente

Domenico

http://documentation.xojo.com/index.php/FolderItem.Launch

Ciao Alan,
vediamo se ho capito quello che vuoi fare (leggendo anche la tua domanda in inglese)

Hai le “icone” dei pdf su un canvas (e qui dovresti chiarire se ne hai più di una, ogni canvas ne ha una sola o altra situazione)
Facendo click sul canvas vuoi che il relativo file pdf (che hai in qualche modo memorizzato) venga aperto dal lettore di pdf di default della macchina.

Ho compreso correttamente?

PS: Su quale piattaforma stai provando?

Ciao Antonio

Allora mi spiego meglio:

Io nel mio programma memorizzo dei file pdf in un database utilizzando un canvas, trascino il file nel canvas e poi lo salvo nel DB.
Adesso quando voglio aprire il pdf , mi piacerebbe fare click sul canvas ed aprire il file con un viewer pdf qualsiasi.

Il metodo folderitem o getopenfolderitem non fanno al caso mio perche io non voglio aprire il folder dove si trova il file pdf , ma lo volgio aprire direttamente dal convas…

E’ possibile?

grazie 10000

Alan

Ciao Antonio

Dimenticavo dirti la piattaforma: sto lavorando su un iMac

Ciao

Faccio l’esempio con un file registrato nella cartella temporanea, ma puoi salvarlo dove ritieni più opportuno

[code]Evento MouseDown del Canvas:
Return True

Evento MouseUp del Canvas:
//Leggi dal db il record rs e il campo “src” è il tuo sorgente pdf
dim f as FolderItem=SpecialFolder.Temporary.Child(“test.pdf”)
dim ok as boolean
if f<>nil and f.IsWriteable then
dim b as binaryStream
try
b=BinaryStream.Create(f,true)
Catch
b=nil
end try
if b<>nil then
b.write rs.field(“src”).stringValue
ok=true
end if
end if
if ok then f.Launch true[/code]

Questo ti apre il tuo pdf (o qualsiasi altro file) con il lettore predefinito e lo mette in primo piano

Ciao Antonio

//Leggi dal db il record rs e il campo “src” il tuo sorgente pdf
dim f as FolderItem=SpecialFolder.ApplicationData.Child(“TherapyPictures_1.sqlite”).Child(FileTypes.Pdf)
dim rs as RecordSet
dim ok as boolean

if f<>nil and f.IsWriteable then
dim b as binaryStream
try
b=BinaryStream.Create(f,true)
Catch
b=nil
end try
if b<>nil then

  b.Write rs.Field("LogoF").StringValue
  ok=true
end if

end if
if ok then f.Launch true

Quando faccio click non succede niente
P.S ho dovuto dichiarare il recordset altrimenti mi dava errore

Alan,
dim f as FolderItem=SpecialFolder.ApplicationData.Child(“TherapyPictures_1.sqlite”).Child(FileTypes.Pdf)
a mio avviso non ha molto senso
in pratica chiedi la cartella applicationData (e fin qui va bene)
all’interno indichi un file chiamato TherapyPictures_1.sqlite (che dal nome direi che sia un db sqlite)
lo tratti come un cartella (ma dovrebbe essere un file dal nome) e dici di creare un file che sia chiama “.pdf”

Secondo me qualcosa non va!
E probabilmente f sar nil per cui tutto il resto non viene eseguito

rs non l’avevo definito volutamente, perch dovresti definirlo tu e popolarlo con una select che richiede il record che ti interessa e al cui interno, da quanto scrivi, c’ un campo “LogoF” che contiene il binario del pdf che vuoi visualizzare.

Verifica e fammi sapere

Ciao Antonio
Ho apportato alcune modifiche seguendo le tue in indicazioni

//Leggi dal db il record rs e il campo “src” il tuo sorgente pdf
dim f as FolderItem=SpecialFolder.ApplicationData.Child(“TherapyPictures_1”)
dim rs as RecordSet
dim ok as boolean

rs = TattooPictures.SQLSelect(“SELECT * FROM Fornitore”)

if f<>nil and f.IsWriteable then
dim b as binaryStream
try
b=BinaryStream.Create(f,true)
Catch
b=nil
end try
if b<>nil then

  b.Write rs.Field("LogoF").StringValue
  ok=true
end if

end if
if ok then f.Launch true

adesso mi apre una anteprima ma come file di immagine invece che come file pdf

siamo vicini credo

cosa ne dici?

Se un immagine invece che un pdf, dipende dal fatto che probabilmente o il pdf registrato in un altro campo, o hai proprio registrato solo l’immagine e non il pdf

tra l’altro cos (anche se solo per immagine) funziona, ma ti far vedere sempre e solo lo stesso file:
la select non seleziona una record tra tanti, ma tutti e quello corrente il primo registrato

ma non so se questo quello che vuoi fare

ok ho visto ora sull’altro post che fai la select correttamente

Ciao Antonio

No il file e’ registrato correttamente nella sua posizione LogoF (F sta per file) e lo carico con la il metodo folderitem , non trascinandolo dalla scrivania, quindi sono sicuro che e’ un file.

Quando faccio click sul database visualizzo la sua icona nel canvas quindi so che e’ quello giusto , poi invece quando faccio click sul canvas mi apre ma come immagine solo la prima pagina.

Adesso quando scrivo dim f as FolderItem=SpecialFolder.ApplicationData.Child(“TherapyPictures_1”) mi apre il file come immagine, mentre quando scrivo cosi dim f as FolderItem=SpecialFolder.ApplicationData.Child(“Test.pdf”) lancia il pdf viewer dando un errore di file danneggiato dicendo che non si puo aprire

mmmm dove sto sbagliando?

Ciao Alan,
non sono sicuro che lo carichi correttamente
Un file immagine diverso da un file pdf
chiaramente anteprima (su mac) apre entrambi ma se una immagine una immagine.

Per tagliare la testa al toro puoi provare cos:
cambia
if b<>nil then

b.Write rs.Field(“LogoF”).StringValue
ok=true

con
if b<>nil then
dim appoggio as string= rs.Field(“LogoF”).StringValue.left(5)
break
b.Write rs.Field(“LogoF”).StringValue
ok=true

esegui il programma sull’ide, e fai creare il file
il programma si fermer sul break e vedrai nel debugger il valore di appoggio
Posta il suo contenuto

ciao

Ciao Antonio

Il valore di “appoggio” e’ quindi hai ragione quando dici che lo sto registrando come immagine invece che come file pdf.

pero come e’ possibile che possa succedere se apro il folder e vedo solo file pdf e niente altro?

please helppp

dipende dal codice che usi quando registri il contenuto del file

postalo (per le parti rilevanti) e vediamo

Ciao Antonio

Questo e’ il metodo per salvare

dim rec as DatabaseRecord
dim rs as RecordSet

// Update customer data

if IDFornitori.Text = “” then
// If we don’t have a tatuatore ID then we need to enter a new record.
// Create a new database record with all of the customer information
rec = New DatabaseRecord
rec.Column(“NomeArticolo”)= item_nome.Text
rec.Column(“RefArticolo”)= ref_articolo.Text
rec.Column(“Quantita”)= qty.Text
rec.Column(“Prezzo”)= prezzo_articolo.Text
rec.Column(“Moneta”)= moneta.Text
rec.Column(“NomeFornitore”)= nome_fornitore.Text
rec.Column(“CognomeFornitore”)= data_inventario.Text
rec.Column(“EmailFornitore”)= email_fornitore.Text
rec.Column(“TelefonoFornitore”)= telefono_fornitore.Text
rec.Column(“IndirizzoFornitore”)= indirizzo_fornitore.Text
rec.Column(“CittaFornitore”)= citta_fornitore.Text
rec.Column(“PaeseFornitore”)=paese_fornitore.Text
rec.Column(“ZipCode”)= zip_code.Text
rec.Column(“Note”)= note_fornitore.Text
rec.PictureColumn(“Logo”) = logo.Backdrop
rec.PictureColumn(“LogoF”) = logo.Backdrop

// Insert Record Into table "Cliente" of the Database
TattooPictures.InsertRecord "Fornitore", rec

// Display Error If One Occurred
if TattooPictures.Error then
  DisplayDatabaseErrorTattooPictures true
  return
end if

else
// We have a customer id so we should update the existing record

// Find the existing record by searching for the customer name
rs = TattooPictures.SQLSelect("SELECT * FROM Fornitore WHERE ID = '" + (IDFornitori.Text) + "'")
if TattooPictures.error then
  DisplayDatabaseErrorTattooPictures true
  return
end if

// Update the existing database record.  First we need to make the
// RecordSet editable which will try to obtain a lock on the record.
// Be sure to check for errors after calling RecordSet.Edit in case
// something went wrong here.
rs.Edit
if TattooPictures.error then
  DisplayDatabaseErrorTattooPictures true
end

// Update the customer information
rs.Field("ID").StringValue= IDFornitori.Text
rs.Field("NomeArticolo").StringValue= item_nome.Text
rs.Field("RefArticolo").StringValue= ref_articolo.Text
rs.Field("Quantita").StringValue= qty.Text
rs.Field("Prezzo").StringValue= prezzo_articolo.Text
rs.Field("Moneta").StringValue= moneta.Text
rs.Field("NomeFornitore").StringValue= nome_fornitore.Text
rs.Field("CognomeFornitore").StringValue= data_inventario.Text
rs.Field("EmailFornitore").StringValue= email_fornitore.Text
rs.Field("TelefonoFornitore").StringValue= telefono_fornitore.Text
rs.Field("IndirizzoFornitore").StringValue= indirizzo_fornitore.Text
rs.Field("CittaFornitore").StringValue= citta_fornitore.Text
rs.Field("PaeseFornitore").StringValue=paese_fornitore.Text
rs.Field("ZipCode").StringValue= zip_code.Text
rs.Field("Note").StringValue= note_fornitore.Text
rs.Field("Logo").PictureValue = logo.Backdrop
rs.Field("LogoF").PictureValue = logoF.Backdrop

// Update the record in the database
rs.Update
if TattooPictures.Error then// handle errors
  DisplayDatabaseErrorTattooPictures true
  return
end if

end

// Commit changes to the database
TattooPictures.Commit

// Update the list of customers
UpdateFornitore

ClearInventarioFields// pulisci le caselle di testo
// riposiziono il cursore sulla casella del nome cliente

mentre con questo genero le “table”

if Principale.TattooPictures.CreateDatabaseFile= false then
MsgBox “Database Error” + EndOfLine + EndOfLine + “There was an error when creating the database”
quit
end if

TattooPictures.SQLExecute “CREATE TABLE Fornitore (ID integer PRIMARY KEY NOT NULL,NomeArticolo varchar,RefArticolo varchar,Quantita varchar,Prezzo varchar,Moneta varchar,NomeFornitore varchar,CognomeFornitore varchar,EmailFornitore varchar,TelefonoFornitore varchar,IndirizzoFornitore varchar,CittaFornitore varchar,PaeseFornitore varchar,ZipCode varchar,Note varchar,Logo binary,LogoF binary)”

TattooPictures.SQLExecute “CREATE TABLE Immagini (ID integer PRIMARY KEY NOT NULL,Stile varchar,imm_1 binary,imm_2 binary,imm_3 binary,imm_4 binary,imm_5 binary,imm_6 binary,imm_7 binary,imm_8 binary,imm_9 binary,imm_10 binary,imm_11 binary,imm_12 binary)”

Mi pare abbastanza chiaro che leggi l’immagine del logo (controllo)
come la crei?
probabilmente leggi il file (magari con un drag and drop), allora devi memorizzare questa variabile e in fase di memorizzazione rileggerne il contenuto (con una funzione simile ma inversa a quella per scrivere il file)

Mmmm credo di aver capito…spero…magari se non ti scoccia mi daresti una pista?

please?

Ciao

pero stavo pensando che quando apro con il metodo folder item e lancio il file f.launch aprendolo in htmlviewer_1 lo vedo bene come file pdf…quindi l’errore si da quando lo salvo nel canvas… perche lo salvo come file immagine e non come file pdf giusto?