Questo codice dovrebbe fare il caso tuo. E' necessario attivare il componente gb.desktop:
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).
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):
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:
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
...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:
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
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:
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:
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 !
Ho pensato di modificare la mia TextEdit, inserendovi anche l'icona "warning" che nell'allegato trasmesso prima, avevo scelto fra le proprietà della Frame contenente la TextEdit.
Ho letto in una delle tante documentazioni disponibili su "html" che si possono inserire immagini. Perciò ho tentato di organizzare il mio messaggio in formato tabella con tre righe e 1 colonna nella prima riga, 2 colonne nella 2a e 3a riga:
MsgMio.richtext = "<TABLE" &
"<Tr><TD> <B> ATTENZIONE! </b></TD>" &
"<Tr><TD rowspan=2 width=300 <A HREF=/home/piero/gambas3-sorgenti/comp/src/gb.form.stock/stock/scalable/warning.svg>" &
"<TD Nessun Conto inizia col NOME digitato>" &
"<TR><TD ------------------ Correggi ------------------>"
ma non funziona e l'icona "warning" non compare. Potrebbe però darsi che non abbia saputo trascrivere il percorso esatto del file che la contiene. Vorrei perciò isolare le due problematiche.
Quindi penso che mi convenga prima sostituire l'icona con un'immagine di cui conosco la locazione, ma non ora.
:sleepy:
ho tentato di organizzare il mio messaggio in formato tabella con tre righe e 1 colonna nella prima riga, 2 colonne nella 2a e 3a riga:
MsgMio.richtext = "<TABLE" &
"<Tr><TD><B> ATTENZIONE! </b></TD>" &
"<Tr><TD rowspan=2 width=300 <A HREF=/home/piero/gambas3-sorgenti/comp/src/gb.form.stock/stock/scalable/warning.svg>" &
"<TD Nessun Conto inizia col NOME digitato>" &
"<TR><TD ------------------ Correggi ------------------>"
ma non funziona e l'icona "warning" non compare. Potrebbe però darsi che non abbia saputo trascrivere il percorso esatto del file che la contiene. Vorrei perciò isolare le due problematiche.
Quindi penso che mi convenga prima sostituire l'icona con un'immagine di cui conosco la locazione, ma non ora.
In vero, il codice presenta alcuni problemi.
Ogni comando va chiuso fra i segni <>, anche quando vengono specificate sue proprietà e valori.
Quando vuoi caricare un'immagine che è presente in memoria va utilizzato il comando IMG src (A HREF si usa invece per i collegamenti esterni via WEB, o anche interni alla pagina html) (l'immagine ovviamente può essere caricata, se lo si preferisce, anche nella cartella "Dati" del progetto, e quindi richiamata semplicemente così: IMG src=mia_immagine.xxx)
Volendo, si può anche riportare in fine la chiusura di ogni comando costituente la tabella.
Dunque quel codice va così corretto ed avremo:
MsgMio.RichText = " <TABLE>" &
"<TR><TD><B> ATTENZIONE! </b></TD></tr>" &
"<TR><TD rowspan=2 width=300><IMG src=percorso_mia_immagine></td>" &
"<TD>Nessun Conto inizia col NOME digitato</td>" &
"<TR><TD> ------------------ Correggi ------------------</td></tr>" &
"</table>"
Quando vuoi caricare un'immagine che è presente in memoria va utilizzato il comando IMG src (A HREF si usa invece per i collegamenti esterni via WEB, o anche interni alla pagina html) (l'immagine ovviamente può essere caricata, se lo si preferisce, anche nella cartella "Dati" del progetto, e quindi richiamata semplicemente così: IMG src=mia_immagine.xxx)
Prima di leggere il tuo consiglio, avevo rivisitato il mio approccio di codice "HTML" ed ero riuscito a farlo funzionare, in parte. Il problema persistente é sull'immagina da fare comparire sotto la prima riga del messaggio ed alla sinistra delle colonne messaggio delle righe 2 e 3.
Come mi hai indicato, ho copiato un'immagine di tipo icona nella acrtella "Dati", interna a quella del mio progetto ContabFam. Il codice riscritto dopo avere seguito il tuo suggerimento ed avere letto qualcosa in giro é il seguente:
MsgMio.richtext = "<TABLE>" &
"<TR><TD width=297 align=center <B>ATTENZIONE!</b>< HR SIZE = 3 WIDTH = 297></TR>" &
"<Tr><TD rowspan=2 width=48><IMG src = PinguinoSherlockHolmes.jpg HEIGHT=48 WIDTH=48> " &
"<TD> Nessun Conto inizia col NOME digitato</TD></TR>" &
"<TR><TD>------------------ Correggi ------------------</TD></TR></TABLE>"
Il risultato è assai diverso da quello che pensavo: non funziona la visualizzazione dell'immaginetta e la lunghezza della 1a colonna delle righe 2 e 3, come puoi constatare dall'allegato.
:(
non funziona la visualizzazione dell'immaginetta e la lunghezza della 1a colonna delle righe 2 e 3, come puoi constatare dall'allegato.
Ho provato il codice, ed ho provato due immagini, una .gif l'altra .jpg: ebbene a me le immagini appaiono entrambe :-\ e si riducono alle dimensioni da te impostate (HEIGHT=48 WIDTH=48).
Riguardo alle dimensioni dell'ampiezza delle colonne, lì ce ne sono due.
Se vuoi modificare la dimensione della colonna di sinistra, devi agire (come hai già fatto) sull'apposita proprietà Width della cella:
"<TR><TD width=297 align=center etc... etc
Se vuoi modificare quella di destra, devi spostare la modifica della proprietà qui:
"<TD width=valore_che_vuoi>Nessun Conto inizia...etc...etc
e toglierla da: "<TR ><TD rowspan=2 width=48><IMG src etc...etc
inoltre devi porre su True la proprietà Wrap della TextEdit !
Ho provato il codice, ed ho provato due immagini, una .gif l'altra .jpg: ebbene a me le immagini appaiono entrambe :-\ e si riducono alle dimensioni da te impostate (HEIGHT=48 WIDTH=48).
Ma non hai modificato niente nel codice che ho allegato nel mio ultimo post?
Stasera sono riuscito ad ottenere un risultato soddisfacente, sia impostando Textedit.Wrap=True, sia modificando ulteriormente il codice "html":
MsgMio.richtext = "<TABLE>" &
"<TR><TD width=290 align=center colspan=2> <B>ATTENZIONE!</b>< HR SIZE = 3 WIDTH = 290></TD></TR>" &
"<Tr><TD width=48><IMG src = Dati/PinguinoSherlockHolmes.jpg HEIGHT=48 WIDTH=48></TD>" &
"<TD width=242> Nessun Conto inizia col NOME digitato</TD></TR>" &
"<TR><TD colspan=2>------------------ Correggi ------------------</TD></TR></TABLE>"
Ho difficoltà invece a fare comparire l'icona warning contenuta nello stosck di Gambas. Infatti scrivendo "IMG src=warning.svg", l'icona non compare. Ho cercato di individuarne la directory in cui rsiede, ma non sono riuscito a capire dove possa essere ubicata. Ho cercato anche fra i file nascosti, ma é stato inutile. Purtroppo per me, io non sono determinato fino in fondo. :-\
Penso perciò che alla fine rinunzierò all'icona inserita nel codice "html" del messaggio e inserirò un pictureBox dentro la frame a cui appartiene anche la TextEdit.
:ciao:
Io non ho capacità di paziente insistenza, ma con una spinta, a volte ce la faccio. Ci sono quasi. Devo solo aggiustare ancora qualcosina e la mia pseudo.MessageBox.fai-da-te è pronta. Qui sotto c'é il codice e l'allegato dell'output prodotto:
MsgMio.richtext = "<TABLE>" &
"<TR><TD width=290 align=center colspan=2> <B>ATTENZIONE!</b>< HR SIZE = 3 WIDTH = 290></TD></TR>" &
"<Tr><TD width=48><IMG src= /home/piero/gambas3-sorgenti/comp/src/gb.form.stock/stock/scalable/warning.svg HEIGHT = 48 WIDTH = 48 > < / TD > " & ""
"<TD width=242> Nessun Conto inizia col NOME digitato</TD></TR>" &
"<TR><TD colspan=2>------------------ Correggi ------------------</TD></TR></TABLE>"
Il risultato mi pare assai soddisfacente, ma soprattutto potrò piazzare le mie Finestre-Messaggi dove vorrò, dentro la Form corrente, secondo le mie necessità.
Grazie, campione :dj:
Ciao.
Ora si che ce l'ho fatta:MsgMio.richtext = "<TABLE>" &
"<TR><TD width=100% align=center colspan=2> <B>ATTENZIONE!</b>< HR SIZE = 3 WIDTH = 100%></TD></TR>" &
"<Tr><TD width=3% rowspan=2><IMG src= /home/piero/gambas3-sorgenti/comp/src/gb.form.stock/stock/scalable/warning.svg HEIGHT=48 WIDTH=48></TD>" &
"<TD width=97%> <BR>Nessun Conto inizia col NOME digitato</TD></TR>" &
"<TR><TD width=97%>------------------ Correggi ------------------</TD></TR></TABLE>"
:2birre:
...ma, scusa, non puoi impostare le coordinate della finestra, che hai creato, attraverso le proprietà .X ed .Y della Classe che hai usato per generare quella finestra ? :-\
la finestra di cui parlo è la classica MessageBox generata con codice simile al seguente:
Message.Warning("<TABLE WIDTH=500><TR><TD><CENTER> <b> Nessuna riga è stata selezionata </b>" & String$(15, "\t") & "<BR> per provvedere all 'autocorrezione <BR> <BR> -------- <b> SELEZIONARE ALMENO UNA RIGA </b> -------- </CENTER>")