Autore Topic: [Risolto] la mmessage.Box nasconde la Text.Box relativa  (Letto 2704 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
[Risolto] la mmessage.Box nasconde la Text.Box relativa
« il: 05 Ottobre 2012, 19:49:30 »
Oggi é comparso un problema per me nuovo. Il codiece che verifica il contenuto di una Text.Box riscontra un errore ed allora produce l'emissione di una finestra Message.Box che va a piazzarsi proprio sulla Text.Box di cui spiega l'anomalia riscontrata, impedendo perciò la lettura della stringa contenuta nella Text.Box, contestualmente alla sua presenza attiva sulla finestra corrente.
Esisterebbe la possibilità di dimensionarla appositamente posizionandola in una parte della finestra preesistente ininfluente ai fini della visione complessiva dell'anomalia   (digitazione + messaggio di errore)?
 :(
« Ultima modifica: 10 Ottobre 2012, 22:29:14 da Picavbg »
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.311
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: la mmessage.Box nasconde la Text.Box relativa
« Risposta #1 il: 05 Ottobre 2012, 23:49:54 »
Questo codice dovrebbe fare il caso tuo. E' necessario attivare il componente gb.desktop:
Codice: gambas [Seleziona]

Private i As Integer


Public Sub Form_Open()

  Dim pr As Process
  Dim ss, x As New String[]
  Dim s, y As String

   pr = Shell "xprop | grep '(WINDOW):'" For Read


  While Not Eof(pr)
    Input #pr, s
    ss.Add(s)
  Wend


 ' Dividiamo la stringa contenente il primo valore esadecimale,
 ' in modo tale da ottenere la seconda parte priva di “0x”:
      x = Split(ss[4], "x")
' Prendiamo del secondo valore esadecimale soltanto le due cifre più a destra:
      y = Right(ss[9], 2)

' Individua il valore esadecimale preciso della finestra, lo trasforma in decimale:
      i = Val("&" & x[1]) - Val("&" & y)

End


Public Sub Button1_Click()

  Dim dw As DesktopWindow


   dw = New DesktopWindow(i)

' effettua lo spostamento della finestra (è possibile anche ridimensionarla a piacimento):
     dw.Move(10, 10)

End


Come funziona:

Appena hai il problema da te rilevato, lancia questo programmino; vedrai che il puntatore del mouse muterà a forma di crocetta. Clicca una volta sulla finestrina del Message.Box che ti ossessiona. Quindi clicca sul Button1 sul programmino.
La finestrina si dovrebbe spostare là dove avrai posto le coordinate (ora settate a 10, 10) di X e Y (puoi anche ridimensionare la finestra aggiungendo W e H).
« Ultima modifica: 06 Settembre 2013, 09:33:54 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: la mmessage.Box nasconde la Text.Box relativa
« Risposta #2 il: 06 Ottobre 2012, 08:45:28 »
Come funziona:

Appena hai il problema da te rilevato, lancia questo programmino; vedrai che il puntatore del mouse muterà a forma di crocetta. Clicca una volta sulla finestrina del Message.Box che ti ossessiona. Quindi clicca sul Button1 sul programmino.
La finestrina si dovrebbe spostare là dove avrai posto le coordinate (ora settate a 10, 10) di X e Y (puoi anche ridimensionare la finestra aggiungendo W e H).

Ho fatto come mi hai detto, lasciando prima le coordinate impostate da te, poi le ho modificat in 5, 5, ma non succede proprio niente. Ho fatto più prove sia cliccando col puntatore a forma di crocetta sulla finestra Message.box che sulla Form in cui é inglobata la Message.Box. Purtroppo non ho ottenuto effetti. Comunque, grazie lo stesso.
 :ciao:
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.311
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: la mmessage.Box nasconde la Text.Box relativa
« Risposta #3 il: 06 Ottobre 2012, 12:06:03 »
Purtroppo non ho ottenuto effetti.
Ieri, ho fatto delle prove su un MessageBox creato da applicativo Gambas, ed è l'unico tipo di finestra che non riuscivo a spostare e/o a ridimensionare.  :-\ Questo, nonostante anche le finestrine di qualunque MessageBox siano - appunto - normali finestre che posseggono un proprio ID !
Sono riuscito ad ottenere il suo spostamento soltanto insieme con il form del programmino principale che aveva generata.

Dagli esperimenti attualmente compiuti, è risultato che un MessageBox in talune circostanze - probabilmente legate al tipo di ambiente desktop grafico e/o al tema - può essere spostato individualmente solo se non è generato dal codice del nostro applicativo Gambas. Se per esempio creiamo un programmino che compie un errore - ad esempio una divisione per zero -, quando la procedura incontra tale richiesta di divisione, essa solleverà un errore facendo apparire un MessageBox. In questo caso sarà possibile effettuare lo spostamento. Se, invece, il nostro programma prevede che venga mostrato ad esempio un Message.Info, sarà impossibile spostarlo o modificarne le dimensioni.

Potrebbe questa fattispecie astratta essere il tuo caso. Lo spostamento con il codice, che ti ho comunicato sopra, molto probabilmente ha avuto problemi nell'individuare con precisione il PID della finestra del MessageBox, in quanto - come hai potuto notare - la procedura, usando "xprop" è un po' complessa: ho visto che con i Message.Box la linea di comando in "xprop"' deve essere un po' diversa (vedi Nota in fondo).

Ma proviamo diversamente.
Il seguente codice prevede che i desktop attivi non abbiano altre finestre aperte. In questo modo il MessageBox che ti appare dovrebbe essere la 3a finestra (quindi la num. 2) attiva (qui si presuppone che il programma principale, ove è contenuto la TextBox, sia un programma eseguibile, non lanciato dall'IDE di gambas):
Codice: gambas [Seleziona]

Public Sub Button1_Click()

  Dim dw As DesktopWindow
  Dim i As Integer

   With Desktop
      i = .Windows[2].Id
   End With

    dw = New DesktopWindow(i)

   With dw
     .Move(10, 500)
    ' .Resize(100, 500)
    ' .Close
   End With

End

Lancerai questo applicativo solo dopo la comparsa del MessageBox che dà fastidio.

Prova una per volta tutte e tre le opzioni (Move - Resize - Close).




Nota:
In tal caso il codice per ottenere - ancora mediante "xprop" - il PID di un MessageBox sarà il seguente:
Codice: gambas [Seleziona]

  Private i As Integer  
  
  
Public Sub Form_Open()  
  
 Dim pr As Process  
 Dim x As New String[]  
 Dim s As String

   pr = Shell "xprop | grep XKLAVIER_STATE" For Read

   While Not Eof(pr)    
     Input #pr, s
' Individua il valore decimale della finestra del "MessageBox":
     If Eof(pr) Then i = CInt(s)
   Wend

End
« Ultima modifica: 06 Settembre 2013, 12:10:58 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.311
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: la mmessage.Box nasconde la Text.Box relativa
« Risposta #4 il: 06 Ottobre 2012, 15:55:13 »
...un'alternativa potrebbe essere quella di considerare non la finestra del MessageBox, bensì del form dove è presente la TextBox. Mi viene da pensare che si potrebbe dilatare in modo da cercare di spostare così la parte della TextBox, di cui desideri leggere il contenuto.

In questo caso opereremo similmente a prima, tenendo presente che in questo caso la finestra, ove è posizionata la TextBox, è stata attivata prima della comparsa del MessageBox. Quindi se il MessageBox era la finestra n. 2, quella del programma principale (parlo sempre di un programma eseguibile, non lanciato dall'IDE di gambas) sarà 1. Avremo dunque:
Codice: gambas [Seleziona]

Public Sub Button1_Click()  
      
   Dim dw As DesktopWindow  
   Dim i As Integer  


      With Desktop  
         i = .Windows[1].Id  
      End With  
      
       dw = New DesktopWindow(i)  
      
      With dw  
         .Resize(W, Y)    ' imposta tu i parametri come preferisci !
      End With  
      
End  
« Ultima modifica: 18 Ottobre 2012, 18:04:25 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: la mmessage.Box nasconde la Text.Box relativa
« Risposta #5 il: 06 Ottobre 2012, 17:22:23 »
Ieri, ho fatto delle prove su un MessageBox creato da applicativo Gambas, ed è l'unico tipo di finestra che non riuscivo a spostare e/o a ridimensionare.  :-\ Nonostante anche le finestrine di qualunque MessageBox è - appunto - una finestra ed possiede un suo PID.
Sono riuscito ad ottenere il suo spostamento soltanto insieme con il form del programmino principale che aveva generata.

Dai miei esperimenti ho notato che un MessageBox può essere spostato individualmente solo se non è generato dal codice del nostro applicativo Gambas.

L'ho pensato anch'io, dopo avere provato il tuo codice. Considera inoltre che le mie Form, tranne la FMain sono tutte utilizzate col metodo ShowModal, quindi sono organizzate a mò di scatole cinesi. Quindi l'unica finestra su cui può agire il codice che mi hai proposto é la FMain.


Mi viene da pensare che si potrebbe dilatare in modo da cercare di spostare la parte della TextBox, di cui desideri leggere il contenuto.
Quindi, se non ho capito male, ogni volta che dovrei vedere in piano parallelo sia la finestra della Message.Box che quella della TextBox, dovrei agire col tuo codice sulla finestra della TextBox, ammesso che possa modificarne la dimensione. Ma tutto questo non posso trasferirilo sull'utente generico, in fase di ordinaria esecuzione, dopo avere ottenuto l'eseguibile del mio ContabFam. Finché proviamo possiamo giocare come vogliamo, ma, non potendo predisporre il posizionamento di una Mesasage.Box sulla finestra di una Form modale, credo proprio che mi convenga abbandonare da subito la tua ottima proposta.  Mi conviene piuttosto ridimensionare la Form e spostare la posizione della TextBox oggetto della presente discussione.
Grazie!
 :ciao:

:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.311
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: la mmessage.Box nasconde la Text.Box relativa
« Risposta #6 il: 06 Ottobre 2012, 19:29:37 »
L'asino, però, non si arrende ancora.

Fai quest'ultimo tentativo, perché a me è riuscito: se non è possibile spostare un MessageBox, allora lo si può rinchiudere.

Useremo per questo altro tipo di particolarissimo spostamento l'oggetto Embedder. In buona sostanza otterremo lo spostamento del MessageBox dentro l'oggetto Embedder che porremo all'interno del nostro programmino spazzamessage.

Si dovrà porre, ovviamente, un oggetto Embedder sul Form del programmino, ed attivare il componente gb.desktop:
Codice: gambas [Seleziona]

Public Sub Button1_Click()

  Dim i As Integer

    With Desktop
' Qui va inserito il numero dell'indice della finestra del "messageBox".
' L'ordine dell'indice puoi vederlo facilmente lanciando in un terminale
' il comando " wmctrl -l -p ":
       i = .Windows[num_index].Id
    End With

     Embedder1.Embed(i)

End



Se vuoi manualmente individuare la finestra da inglobare, puoi usare ancora una volta il comando xprop, con il codice descritto sopra nella Nota:
Codice: gambas [Seleziona]

Private i As Integer    
  
  
Public Sub Form_Open()    
  
Dim pr As Process    
Dim s As String  
  
  pr = Shell "xprop | grep XKLAVIER_STATE" For Read  
  
  While Not Eof(pr)      
    Input #pr, s  
' Individua il valore decimale della finestra del "MessageBox":  
    If Eof(pr) Then i = CInt(s)  
  Wend  
  
End


Public Sub Button1_Click()

  Embedder1.Embed(i)

End


A me con entrambe le soluzioni ha funzionato anche con i MessageBox più recalcitranti, come gli... asini !
« Ultima modifica: 18 Ottobre 2012, 18:05:15 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: la mmessage.Box nasconde la Text.Box relativa
« Risposta #7 il: 08 Ottobre 2012, 10:28:58 »
Scusate l'intromissione.
@Picavbg
Ma se il testo della message box è generato da te, non potresti riportare nel messaggio il contenuto della textbox?

@Vuott
Visti i tuoi studi e l'impegno profuso propongo agli amministratori di promuoverti almeno a Cavallo... :D
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: la mmessage.Box nasconde la Text.Box relativa
« Risposta #8 il: 08 Ottobre 2012, 10:35:19 »
Hai saltato il grado "Mulo"...  ;D

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: la mmessage.Box nasconde la Text.Box relativa
« Risposta #9 il: 08 Ottobre 2012, 12:58:29 »
@Picavbg
Ma se il testo della message box è generato da te, non potresti riportare nel messaggio il contenuto della textbox?
Complimenti per l'idea! Esisterebbero anche altre possibilità, una é, per es., quella di craere una form specifica "fai da te" per i messaggi, delle dimensioni e coordinate di posizionamento a scelta dell'amatore.  Però io pensaserei di affrontare la questione in naturalgambas, ma a quanto pare non é possibile. Devo perciò subire la prepotenza di Gambas che si permette, senza nemmeno chiedere che cosa ne pensi il programmatore applicativo, di posizionare la finestra di Message.Box dove gli pare. Aggiungo che lo studio di vuott é molto interessante, ma, anche se non l'ha ancora detto, la sua azione di riposizionamento ed aggiustamento delle dimensioni della finestra può avere luogo solo dopo che la finestra sia comparsa sul desktop, e questo non sta bene.  :)

@ vuott
Citazione da: vuott
L'asino, però, non si arrende ancora.
.........
.........
.........
A me con entrambe le soluzioni ha funzionato anche con i MessageBox più recalcitranti, come gli... asini !
Ma la vuoi finire con le tue balorde autodefinizioni?   :nonono:
Se non lo vuoi fare per te, fallo almeno per tutti quelli che ti leggiamo e non siamo pochi, perché indirettamente ci manchi di rispetto: prima di autodefinisci "sceccu" e poi ci suggerisci le tue soluzioni.    :violent:   Ma ti sembra che possiamo andare avanti così?   >:( :evil:

Devo ancora dirti che sto cercando, nei limiti delle mie possibilità, sicuramente assai ridotte rispetto alle tue, di capire tutto quello che mi hai proposto nel tuo menù informatico e non ho ancora superato il primo ostacolo su "wmctrl", comando che ho dovuto installare , perché sconosciuto dal default di fedora.

Perciò, se arranco a seguire i tuoi ragionamenti e le tue prove, trova un avatar-attributo adatto alla mia scadente stazza di mente animalesca.  ;)
Se ti ho offeso, allora ... facci il favore, smettila con le tue autodefinizioni e inserisci nel tuo profilo un avatar sopportabile anche all'occhio del destinatario dei tuoi messaggi.  :evil:
Sono stato chiaro?   :poke:
 :ciao:


:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.311
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: la mmessage.Box nasconde la Text.Box relativa
« Risposta #10 il: 08 Ottobre 2012, 14:18:35 »
Ma se il testo della message box è generato da te, non potresti riportare nel messaggio il contenuto della textbox?
Questa, ovviamente, è la soluzione ottimale, da vero... super-purosangue di razza !  ;D

A me era parso di capire che picavbg il MessageBox non fosse previsto da lui nel codice. Solo ora, leggendo il tuo intervento ed andando a rileggere il primo intervento di picavbg, mi rendo conto che il MessageBox è voluto:
« Il codice che verifica il contenuto di una Text.Box riscontra un errore ed allora produce l'emissione di una finestra Message.Box ».


Visti i tuoi studi e l'impegno profuso propongo agli amministratori di promuoverti almeno a Cavallo...
...ma se qua non riesco neanche a capire più quello che uno scrive  :hard: , devo essere retrocesso irrimediabilmente a "ronzino" !


...ma, anche se non l'ha ancora detto,la sua azione di riposizionamento ed aggiustamento delle dimensioni della finestra può avere luogo solo dopo che la finestra sia comparsa sul desktop
E' così, sì: quei comandi e quelle funzioni agiscono - appunto - solo sulle finestre già aperte.


non ho ancora superato il primo ostacolo su "wmctrl"
Ovviamente ci sono l'help ed i manuali in giro su internet. Su questo forum ne proposi l'uso in questo caso:
http://www.gambas-it.org/smf/index.php?topic=1923.msg21307#msg21307
« Ultima modifica: 08 Ottobre 2012, 14:36:01 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: la mmessage.Box nasconde la Text.Box relativa
« Risposta #11 il: 08 Ottobre 2012, 14:50:04 »
...ma, anche se non l'ha ancora detto,la sua azione di riposizionamento ed aggiustamento delle dimensioni della finestra può avere luogo solo dopo che la finestra sia comparsa sul desktop
E' così, sì: quei comandi e quelle funzioni agiscono - appunto - solo sulle finestre già aperte.

Allora, a questo punto mi pare opportuno un riepilogo:
Il mio ContabFam controlla, all'interno di una sua Form.Class, la digitazione dell'operatore e, in funzione della condizione di uguaglianza non trovata, all'interno di una tabella del DB correlato, emette una MessageBox per segnalare il mancato riscontro. Detta MessageBox viene prodotta da Gambas andando casualmente a sovrapporsi alla TextBox contenente la digitazione dell'utente, impedendone perciò il riscontro visuale, mentre è attiva la finestra di MessageBox.

Soluzione pensata da me: riuscire a comunicare a Gambas, insieme con la stringa di segnalazione, le coordinate di posizionamento della MessageBox dentro la Form attiva.
Soluzione proposta da vuott: intervenire con codice distinto per spostare e/o ridimensionare la MessageBox.
Soluzione proposta da Sotema: ripetere dentro la MessageBox la stringa già contenuta nella TextBox iniziale.

Orientamento mio attuale: Disegnare una Form che funzioni come una MessageBox, ma preimpostabile con coordinate X,Y e dimensionamento in Height e Width.
Penso che solo così posso andare a piazzare la MessageBox.Fai-da-te dove vorrò coi caratteri e  coi colori che riterrò al momento più opportuni.

Mentre scrivo mi sta venedo una nuova idea:  costruire un rettangolo, simulazione di MessageBox, attraverso il codice html.  :D
 :ciao:

:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.311
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: la mmessage.Box nasconde la Text.Box relativa
« Risposta #12 il: 08 Ottobre 2012, 15:57:21 »
Soluzione proposta da vuott: intervenire con codice distinto per spostare e/o ridimensionare la MessageBox.
Vorrei fare un'integrazione a quella che era la mia linea strategica: dato che si è chiarito che si tratta di un MessageBox previsto dal progetto stesso, a questo punto si sarebbe potuto pensare - ovviamente - ad una sub-routine specifica nello stesso applicativo.
Ma comunque questa ipotesi è chiaramente ormai superata.


costruire un rettangolo, simulazione di MessageBox, attraverso il codice html.
In che zenzo ? Come potresti costruire un rettangolo attraverso il codice html ?
« Ultima modifica: 08 Ottobre 2012, 15:58:57 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: la mmessage.Box nasconde la Text.Box relativa
« Risposta #13 il: 08 Ottobre 2012, 19:24:02 »
costruire un rettangolo, simulazione di MessageBox, attraverso il codice html.
In che zenzo ? Come potresti costruire un rettangolo attraverso il codice html ?
In effetii quello che ho scritto abbagliato dal lampo arrivato in quel momento non era un concetto completo, perciò non potevo capirmi nemmeno io. Riprendendo a mente serena quanto scritto, mi sono accorto che l'HTML ha bisogno di un oggetto a cui appoggiarsi e l'oggetto bisogna costruirlo. Ho pensato allora di creare una frame dentro la quale disporre una TextEdit nella quale scrivere il messaggio informativo del tipo (warning, Info, Error) da decidere. La stessa TextEdit potrebbe contenere l'icona uguale a quella della MessageBox, mentre sotto alla TextEdit potrei porre il pulsante di conferma per riavviare il programma dal punto dell'interruzione. Qualcosa simile all'immagine allegata.  :)
 :ciao:
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.311
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: la mmessage.Box nasconde la Text.Box relativa
« Risposta #14 il: 08 Ottobre 2012, 19:40:06 »
Sì, ho capito.
 Be'... sì, puoi usare anche l'html (proprio ora ho finito di aggiungere nell'apposita pagina della WIKI http://www.gambas-it.org/wiki/index.php/Controlli_e_finestre_che_supportano_il_codice_HTML altri codici supportati da alcuni oggetti che possono gestire il codice html).
Però è chiaro che puoi usare anche le sole funzioni proprie di Gambas.
A te la scelta.  :-\
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »