Autore Topic: Aprire il browser  (Letto 1840 volte)

Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
Aprire il browser
« il: 08 Ottobre 2008, 19:14:57 »
Come posso fare per aprire il browser predefinito su un certo url?

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Aprire il browser
« Risposta #1 il: 08 Ottobre 2008, 20:01:29 »
Guarda se questo metodo ti può essere utile, è inserito anche in pgDesigner (tanto per fare un pò di pubblicità... :-) )

Codice: [Seleziona]

'---
' Test for system browser identified
'
' @parameter : String : Link
'
STATIC PUBLIC SUB OpenWebPage(sLink AS String)
  DIM sBrowser AS String
  DIM aTest AS String[]
  DIM bCheck AS Boolean
  aTest = [Application.Env["BROWSER"]]
  IF (Application.Env["KDE_FULL_SESSION"]) THEN
    aTest.Add("konqueror")
  ELSE IF (Application.Env["GNOME_DESKTOP_SESSION_ID"]) THEN
    aTest.Add("epiphany")
    aTest.Add("firefox")
  END IF
  aTest.Add("konqueror")
  aTest.Add("mozilla-firefox")
  aTest.Add("firefox")
  aTest.Add("mozilla")
  aTest.Add("seamonkey")
  aTest.Add("opera")
  FOR EACH sBrowser IN aTest
    bCheck = NOT CheckProgram(sBrowser)
    IF bCheck THEN BREAK
  NEXT
  IF NOT bCheck THEN
    pgDialogHelp.Create(sLink).ShowModal()
  ELSE  
    IF Left(sLink) = "/" THEN sLink = "file://" & Replace(sLink, "?", "%3F")
    SHELL sBrowser & " " & Chr$(34) & sLink & Chr$(34)
  END IF
CATCH
  pgApplication.TraceError(pgApplication.GetError(), TRUE)
END


Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
Re: Aprire il browser
« Risposta #2 il: 09 Ottobre 2008, 01:52:48 »
Con qualche modifichina ha funzionato da dio!! Grazie. Incredibilmente, sono riuscito a implementare senza troppi problemi anche la funzione CheckProgram. Dico incredibilmente non perchè io sia un cretino (non più di tanto almeno) ma perchè questo è il mio primo esperimento in Gambas. Qualche anno fa ho avuto la disgrazia di lavorare a un grosso progetto in VB (la cosa meno free che abbia mai visto: tu affittavi questo server windows e la necessaria assistenza... non potevi nemmeno provare a fare delle modifiche perchè la documentazione ti diceva di fare delle cose, ma se le facevi distruggevi il database, spero che la ditta abbia fallito o che almeno il proprietario sia morto). Dicevo, si ho lavorato in VB ma o è molto diverso oppure io non mi ricordo nulla.

Vabbè, forse la mia storia non ti interessa :)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Aprire il browser
« Risposta #3 il: 09 Ottobre 2008, 11:59:03 »
Non è che non mi interessa, è che è solo una delle tante realtà dell'informatica applicata al mondo del lavoro...

Diciamo che ho una certa esperienza in materia, e pure un'età certa... :-)

Comunque, non essere troppo cattivo... non conosco la tua età, ma purtroppo devo dirti che di queste cose te ne capiteranno parecchie, anzi, diciamo che sono lo stato normale; il difficile è trovare situazioni pulite...

Ad ogni modo sono contento che il pezzetto di codice ti sia stato utile, l'unica cosa che mi incuriosisce è quale modifica hai apportato; a meno che questa sia legata solo alla logica del tuo programma, potrebbe essere utile pubblicare su questo forum cosa hai fatto di utile.

Bye

Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
Re: Aprire il browser
« Risposta #4 il: 09 Ottobre 2008, 17:39:54 »
Non so, io qualche porcata l'ho vista, ma un help che ti fa fare una cosa e poi il database diventa illeggibile mi sembra un po' troppo :) Almeno pagassero bene i dipendenti :)

No, le modifiche non sono nulla di interessante, posso solo consigliarti di aggiungere all'elenco iceweasel (il Firefox di Debian), icecat e lynx (testuale).

Piuttsto, mi chiedevo se non ci sia una variabile d'ambiente di GNOME/KDE che dica qual è il browser predefinito dell'utente...

Ti faccio vedere come ho implementato CheckProgram, così magari mi dici se si può fare di meglio:

STATIC PUBLIC FUNCTION CheckProgram(sName AS String) AS Boolean
  ' checks if sName exists
  DIM result AS String
  SHELL "which " & sName TO result
  IF Process.LastValue = 0 THEN
    RETURN TRUE
  ELSE  
    RETURN FALSE
  ENDIF
END

Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
Re: Aprire il browser
« Risposta #5 il: 09 Ottobre 2008, 17:44:48 »
Scusa, lo riposto:

Codice: [Seleziona]

STATIC PUBLIC FUNCTION CheckProgram(sName AS String) AS Boolean
  ' checks if sName exists
  DIM result AS String
  SHELL "which " & sName TO result
  IF Process.LastValue = 0 THEN
    RETURN TRUE
  ELSE  
    RETURN FALSE
  ENDIF
END

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Aprire il browser
« Risposta #6 il: 10 Ottobre 2008, 10:55:11 »
Forse non hai letto bene il codice che ti ho inviato; il metodo Application.Env() ritorna il set di variabili di ambiente dell'utente, che puoi verificare digitando "env" da riga di comando.
KDE e Gnome hanno due variabili che indentificano appunto il browser, però questo dipende anche da come è strutturata la distro; tieni presente che queste variabili sono scritte in un file, di solito "profile", situato nella directory /etc del sistema, ma non è detto che vengano impostate per o da tutti. Linux permette ad ogni utente di impostare le proprie variabili di ambiente private, e volendo anche sovrascrivere quelle di default; magari nessuno lo fà, perchè ciò non lo esclude, per cui è necessario tenerlo a mente quando si scrive un programma. Oltre a ciò, l'accesso al sistema operativo comporta una serie di problemi che potrebbero causare problemi nel caso di elaborazioni complesse (vedi tempi di risposta), e quindi è necessario prima analizzare bene questo tipo di approccio.

Nelle tue modifiche usi un comando esterno per sapere se esiste e dove si trova un determinato programma; la cosa è valida, ma io sono dell'opinione di tentare di usare il più possibile le funzioni interne di Gambas.
Nel mio esempio, in effetti, viene usato alla fine un comando per eseguire il browser di sistema; questo purtroppo è necessario, in quanto Gambas non mi sembra abbia ancora le strutture necessarie per eseguire dall'interno programmi esterni, come esiste invece in altri linguaggi. In questo caso il discorso diventa obbligatorio, ma tieni conto che l'esempio che ti ho inviato fà parte di una struttura più ampia, in cui il programma fà decidere all'utente in che modo visualizzare una determinata pagina html e, eventualmente, c'è una form interna all'applicazione che fà da browser.

Ad ogni modo ti ringrazio per l'aggiunta dei nomi di browser che hai suggerito, provvederò ad inserirli nella funzione in modo da renderla più completa; io, del resto, avevo inserito solo quelli più conosciuti, e non mi ero preoccupato al momento di analizzare se ne esistevano possibili altri.

Ops, scusa, mi ero dimenticato un'altro pezzo, un'altra funzione che viene chiamata da quella che ti ho inviato in precedenza; in effetti uso anche io il comando "which" :-) :

Codice: [Seleziona]

'---
' Verify if a program exist
'
' @parameter : String : Program name
' @return : Boolean : TRUE=exist, else FALSE
'
STATIC PUBLIC FUNCTION CheckProgram(program AS String) AS Boolean
  DIM iPos AS Integer
  iPos = InStr(program, " ")
  IF (iPos) THEN program = Left(program, iPos - 1)
  SHELL "which " & program & " >/dev/null 2>&1" WAIT
  IF Process.LastValue THEN RETURN TRUE
  RETURN FALSE
CATCH
  pgApplication.HaltError(pgApplication.GetError(), TRUE)
END


Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
Re: Aprire il browser
« Risposta #7 il: 10 Ottobre 2008, 12:49:50 »
Grazie della spiegazione esaustiva!

Mi sembra però che tu faccia una cosa strana: se non sbaglio il tuo CheckProgram restituisce true se il programma non esiste e viceversa, valore che poi viene invertito quando lo assegni a bChecl (bCheck = NOT CheckProgram(...)). Sbaglio?

Comunque anch'io non userei which se fossi a conoscenza di un metodo Gambas che fa la stessa cosa :)

Offline giulio

  • Maestro Gambero
  • ****
  • Post: 280
    • Mostra profilo
Re: Aprire il browser
« Risposta #8 il: 10 Ottobre 2008, 13:01:49 »
Si può fare così:

Codice: [Seleziona]


DIM bInstallato as Boolean
DIM sDirectory, sProgramma as String

FOR EACH sProgramma IN Split("firefox,konqueror")
   
  bInstallato = FALSE
   
  FOR EACH sDirectory IN Split(Application.Env["PATH"], ":")
    IF Exist(sDirectory &/ sProgramma) THEN
      bInstallato = TRUE    
      BREAK  
    ENDIF
  NEXT  
   
  'qui fai qualcosa se bInstallato è TRUE o resta FALSE  


NEXT


però in questo caso l'uso di "which" non lo trovo sbagliato. "which" è sempre presente su qualsiasi distribuzione GNU/Linux. Almeno, credo :-)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Aprire il browser
« Risposta #9 il: 10 Ottobre 2008, 19:29:50 »
Perdonami, la mia era solo una generalità...

Infatti, come vedi, ho usato anche io la chiamata ad un programma esterno, perchè in Gambas non c'è modo di fare altrettanto.

Il codice di ritorno invertito mi è servito per altre cose, i pezzi che ti ho inviato sono una piccola parte. Ad ogni modo il significato di un valore logico dipende sempre da te, nel senso che il significato TRUE non è detto che sia per forza di cose legato al fatto che una cosa è vera, un esempio può essere ERROR che dice che c'è un errore, ma non puoi ritornarlo così com'è da una funzione, a meno che quest'ultima non abbia un significato del tipo: "la funzione è errata?".

Sò che il giro di parole è un pò fumoso, ma spero spieghi il senso...

Rigurdo alle variabili di ambiente, sono moltissimi i programmi che vi si appoggiano per conoscere lo stato del sistema; per fortuna esiste il metodo Application.Env(), altrimenti si è costretti nuovamente ad accedere al sistema con un 'SHELL "env"' e spacchettarsi gli elementi...