Precedente :: Successivo |
Autore |
Messaggio |
rickyrey Mortale devoto

Registrato: 08/02/10 15:32 Messaggi: 5 Residenza: pavia
|
Inviato: 08 Feb 2010 15:36 Oggetto: Richiamo Funzione vb 2008 da acucobol |
|
|
Buongiorno a tutti.
Ho un progetto vb 2008 per una dll, all'interno della quale ? contenuta una
funzione, esposta come pubblica.
Richiamo la funzione da un programma cobol, passandole i dovuti parametri e
fin qui tutto funziona bene; la funzione mette a video un form con alcuni
campi di input (fra gli altri). L'utente compila i campi di input e alla
fine, per mezzo della pressione di un tasto (es. invio), l'input compilato
dovrebbe tornare al programma cobol. Il problema si presenta perche' pare
che, fino alla chiusura del form (o meglio, del richiamo alla dll), il
controllo non torni a cobol. In concreto avrei bisogno di qualche metodo che
mi permetta di restituire la stringa di ritorno della funzione al programma
cobol, senza chiudere il form a video, in modo che poi il programma cobol
possa inviarmi una successiva richiesta di un altro form, che dovrebbe
sostituire quello gi? a video. Tutto questo dovrebbe avvenire, credo, senza
chiudere l'istanza attiva della dll (non per mie esigenze particolari ma
perche' non mi viene in mente un altro modo per lasciare a video il form
finche' non viene caricato quello successivo).
Grazie per l'aiuto
Ps.
Utilizzo l'istruzione "modify" in acu cobol x visualizzare la maschera vb il problema e' che fino a che non si chiude la maschera il "focus" non ritorna a cobol e rimane in attesa all'interno dell'istruzione modify..... esiste un modo per non rendere questa istruzione "SOSPENSIVA" ????
Riccardo |
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 13 Feb 2010 19:43 Oggetto: |
|
|
Puoi postare un po' di codice? |
|
Top |
|
 |
rickyrey Mortale devoto

Registrato: 08/02/10 15:32 Messaggi: 5 Residenza: pavia
|
Inviato: 15 Feb 2010 15:34 Oggetto: |
|
|
Da parte cobol o Vb........
dimmi di cosa hai bisogno.......
se vuoi posso anche inviarti una mail con allegato tutto quello che possa servirti....
Aiutami sono nella "cacca"........hehehheh........ |
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 17 Feb 2010 20:01 Oggetto: |
|
|
Secondo me possiamo iniziare dal codice della funzione in vb.
Dato che il problema è che la funzione fatica a spedire i dati a cobol penso che dovremmo iniziare a guardare il codice che viene eseguito allo scattare dell'evento che usi per inviare i dati. |
|
Top |
|
 |
rickyrey Mortale devoto

Registrato: 08/02/10 15:32 Messaggi: 5 Residenza: pavia
|
Inviato: 18 Feb 2010 14:45 Oggetto: Richiamo Funzione vb 2008 da acucobol |
|
|
come faccio ad inviarti il progetto in vb ?
come allego il file zip ?
Ti ringrazio di cuore....... sto impazzendo.......... |
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 18 Feb 2010 21:08 Oggetto: |
|
|
Posta pure qui il segmento di codice vb che si occupa di mandare i dati a cobol.
Magari metti pure qualche commento così mi raccapezzo.
Non serve a nulla mandarmi l'intero progetto perchè:
1) non ho macchine su cui farlo girare
2) vb è un po' che non lo seguo ma dovrei essere ancora in grado se non altro di leggerlo; dato che non lo uso nè per lavoro nè per altro, si ricade nel punto 1. |
|
Top |
|
 |
rickyrey Mortale devoto

Registrato: 08/02/10 15:32 Messaggi: 5 Residenza: pavia
|
Inviato: 19 Feb 2010 10:28 Oggetto: Cobol e vb2008 |
|
|
Prima Parte : Maschera.vb
Codice: | Imports System.Windows.Forms
Imports MySql.Data.MySqlClient
Imports System.Drawing
Imports System.Runtime.InteropServices
Public Class Maschera
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Private Declare Function SetForegroundWindow Lib "user32" (ByVal handle As IntPtr) As Integer
Dim WithEvents campoI As TextBox
Dim WithEvents MascheraForm As Form
Dim TabellaMaschera As DataTable
Dim TabellaCampi As DataTable
Dim campo As Object
Public inputStringa As String
Dim segnaStringa As Integer = 1 'Numero di caratteri già letti nella stringa di input
Dim uscita As Boolean = False 'Flag che indica se sto ancora aspettando un input dall'utente
Dim record As System.Data.DataRow
Dim strRitorno As String = ""
Dim connessione As MySqlConnection
Dim funzione As String = ""
Dim nomeMascheraOld As String = ""
Dim pidPadre As Integer
Private Sub connessioneDb(ByVal nomeMask As String)
' Eseguo tutte le operazioni sul database in un blocco
' Try...Catch per intercettare eventuali errori e mostrarli
Try
If connessione Is Nothing Then
connessione = New MySqlConnection(My.Settings.fdpConnectionString.ToString)
connessione.Open()
End If
' Creo un adattatore dati passandogli la query (dati della maschera)
Dim AdattatoreMaschera As New MySqlDataAdapter("SELECT * FROM testmaschera1 WHERE nmask='" & nomeMask & "'", connessione)
' Creo un adattatore dati passandogli la query (dati dei campi)
Dim AdattatoreCampi As New MySqlDataAdapter("SELECT * FROM testmaschera2 WHERE nmask2='" & nomeMask & "'", connessione)
' Creo una tabella dati (della maschera)
TabellaMaschera = New DataTable
' Creo una tabella dati (dei campi)
TabellaCampi = New DataTable
' Dico all'adattatore di riempire la tabella dati (della maschera)
AdattatoreMaschera.Fill(TabellaMaschera)
' Dico all'adattatore di riempire la tabella dati (dei campi)
AdattatoreCampi.Fill(TabellaCampi)
' Libero le risorse
AdattatoreMaschera.Dispose()
AdattatoreCampi.Dispose()
Catch ex As Exception ' Si è verificato un errore
strRitorno = "Attenzione! Si è verificata un'eccezione: " & _
vbCrLf & vbCrLf & ex.ToString
ritorno()
Exit Sub
End Try
End Sub
Public Function genMap(ByVal pidPad As Integer, ByVal nomeMaschera As String, ByVal inputStringaEsterna As String) As String
pidPadre = pidPad
If MascheraForm Is Nothing Then
Dim miaMask As New Maschera
Else
If nomeMaschera = nomeMascheraOld Then
MascheraForm.Dispose()
MascheraForm = New Form
Else
Dim ff As New FormFreezer(MascheraForm, True)
For i = 0 To (MascheraForm.Controls.Count - 1)
MascheraForm.Controls.RemoveAt(0)
Next
ff.Unfreeze()
End If
nomeMascheraOld = nomeMaschera
End If
If nomeMaschera = "F3" And inputStringaEsterna = "F3" Then
connessione.Dispose()
'MascheraForm.Close()
uscita = True
End If
inputStringa = inputStringaEsterna
uscita = False 'In attesa di input da parte dell'utente
'Connessione al db con lettura dati della maschera e dei campi
connessioneDb(nomeMaschera)
'Imposto le proprietà della maschera
record = TabellaMaschera.Rows(0)
creaMaschera()
'Creo i campi e ne imposto le proprietÃ
For i As Integer = 0 To TabellaCampi.Rows.Count - 1
record = TabellaCampi.Rows(i)
Select Case record("TipoCampo")
Case "I" 'Campi input
campo = New TextBox
campo.autosize = False
campo.maxlength = record("Maxchar")
creaCampo()
campo.Text = Mid$(inputStringa, segnaStringa, CInt(record("Maxchar").ToString))
segnaStringa += CInt(record("Maxchar").ToString)
campo.bringtofront()
Case "O" 'Campi output
campo = New Label
campo.autosize = False
creaCampo()
campo.Text = Mid$(inputStringa, segnaStringa, CInt(record("Maxchar").ToString))
segnaStringa += CInt(record("Maxchar").ToString)
campo.bringtofront()
Case "T" 'Campi fissi
campo = New Label
campo.autosize = False
creaCampo()
campo.text = record("TestoFisso").ToString
campo.bringtofront()
Case "B" 'Campi bottone
campo = New Button
campo.autosize = False
creaCampo()
campo.bringtofront()
Case "S" 'Campi disegno
campo = New Label
campo.autosize = False
creaCampo()
campo.sendtoback()
End Select
Next
MascheraForm.ShowInTaskbar = True
If Not MascheraForm.Visible Then
MascheraForm.ShowDialog()
End If
Do While strRitorno = ""
Threading.Thread.Sleep(1000)
Loop
Try
Debug.Print(strRitorno)
Return strRitorno
Catch ex As Exception
Finally
End Try
'Return ritorno()
Return strRitorno
Debug.Print(strRitorno)
'Call ritorno()
Do While Not uscita
Threading.Thread.Sleep(1000)
Loop
End Function
'Private Sub videoMap()
'MascheraForm.ShowDialog()
''MascheraForm.Show()
''Verificare se va bene showdialog
'End Sub
Public Sub New()
'MsgBox("Creata nuova maschera")
MascheraForm = New Form
End Sub
Private Sub creaMaschera()
'Routine per la creazione della maschera e l'impostazione delle sue proprietÃ
With MascheraForm
.KeyPreview = True
.MaximizeBox = False
.MinimizeBox = False
.ShowInTaskbar = False
.Height = CInt(record.Item("Lunghezza").ToString)
.Width = CInt(record.Item("AltezzaF").ToString)
.Top = CInt(record.Item("PosizioneFY").ToString)
.Left = CInt(record.Item("PosizioneFX").ToString)
.BackColor = creaColore(CInt(record.Item("Sfondo").ToString))
End With
End Sub
Private Sub creaCampo()
'Routine per la creazione dei campi di input
'Associo il campo al form da visualizzare
campo.Parent = MascheraForm
'Imposto posizione e dimensioni del campo
campo.Left = record("POSX")
campo.Top = record("POSY")
campo.Height = record("ALTEZZA")
campo.Width = record("LUNGHEZZA")
'Definisco il font del campo
Dim nomeFont As String = ""
Select Case record("TIPOFONT")
Case 0
nomeFont = "Arial"
Case 1
nomeFont = "Book Antiqua"
Case 2
nomeFont = "Comic Sans MS"
Case 3
nomeFont = "Courier"
Case 4
nomeFont = "Courier New"
Case 5
nomeFont = "Lucida Console"
Case 6
nomeFont = "MS Sans Serif"
Case 7
nomeFont = "System"
Case 8
nomeFont = "Tahoma"
Case 9
nomeFont = "Terminal"
Case 10
nomeFont = "Times New Roman"
Case 11
nomeFont = "Verdana"
End Select
campo.Font = New System.Drawing.Font(nomeFont, CSng(record("DIMENSIONEFONT")))
campo.ForeColor = creaColore(CInt(record("COLORFONT")))
campo.BackColor = creaColore(CInt(record("COLORSFONDO")))
With campo
Select Case Trim$(UCase$(record("STYLEFONT").ToString))
Case ""
Case "B"
.Font = New Font(nomeFont, campo.font.size, FontStyle.Bold)
Case "I"
.Font = New Font(nomeFont, campo.font.size, FontStyle.Italic)
Case "S"
.Font = New Font(nomeFont, campo.font.size, FontStyle.Underline)
Case "BI"
.Font = New Font(nomeFont, campo.font.size, FontStyle.Bold Or FontStyle.Italic)
Case "BS"
.Font = New Font(nomeFont, campo.font.size, FontStyle.Bold Or FontStyle.Underline)
Case "IS"
.Font = New Font(nomeFont, campo.font.size, FontStyle.Italic Or FontStyle.Underline)
Case "BIS"
.Font = New Font(nomeFont, campo.font.size, FontStyle.Bold Or FontStyle.Italic Or FontStyle.Underline)
End Select
End With
'...............
End Sub
Private Sub Intercetta_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MascheraForm.KeyDown
Select Case e.KeyData
Case Keys.F1, Keys.Enter
funzione = "$F01$"
Case Keys.F3
funzione = "$F03$"
Case Else
'If sender.
Exit Sub
End Select
MascheraForm.DialogResult = DialogResult.OK
e.SuppressKeyPress = True
e.Handled = True
End Sub
Private Sub Intercetta_DialogResultChange(ByVal sender As Object, ByVal e As FormClosingEventArgs) Handles MascheraForm.FormClosing
Call ritorno()
If strRitorno = "$F01$123" Then
'ATTENZIONE Stringa usata come test per uscire dal programma
e.Cancel = False 'Chiudo la maschera
'Call attesa()
Else
e.Cancel = True 'Tengo aperta la maschera
'Call attesa()
End If
'e.Cancel = True 'Imposto a true per lasciare aperta la maschera, con false la chiudo
'e.Cancel = False
End Sub
Private Sub attesa()
Do While True
Threading.Thread.Sleep(500)
Loop
End Sub
Private Sub ritorno()
'Restituisce tutto l'input presente sulla maschera a video
Dim stringa As String = funzione
For Each campo As Windows.Forms.Control In MascheraForm.Controls
If TypeOf (campo) Is Windows.Forms.TextBox Then
stringa += campo.Text
End If
Next
strRitorno = stringa
Debug.Print(strRitorno)
Debug.WriteLine(MascheraForm.Visible)
'Dim processo As New Process
'processo = Process.GetProcessById(pidPadre, My.Computer.Name)
'processo.StartInfo.FileName = processo.ProcessName
'processo.StartInfo.UseShellExecute = False
'Process.Start(processo.StartInfo)
'My.Computer.Keyboard.SendKeys(strRitorno, True)
End Sub
'Public Property outputStringa(ByVal nomeMaschera As String, ByVal inputStringaEsterna As String) As String
' Get
' genMap(nomeMaschera, inputStringaEsterna)
' outputStringa = ritorno()
' End Get
' Set(ByVal value As String, ByVal nomeMaschera, ByVal inputStringaEsterna)
' genMap(nomeMaschera, inputStringaEsterna)
' 'outputStringa = ritorno(nomeMaschera, inputStringaEsterna)
' End Set
'End Property
End Class
===============================================
Seconda Parte Main.vb :
Imports MaskLibrary.Maschera
Imports System.Windows.Forms
Imports System.Drawing
Module Main
''' <summary>
''' Restituisce il colore associato al codice colore scelto
''' </summary>
''' <param name="codColore"></param>
''' <returns></returns>
''' <remarks></remarks>
Function creaColore(ByVal codColore As Integer) As System.Drawing.Color
Select Case codColore
Case 1
Return System.Drawing.Color.FromArgb(99, 35, 31)
Case 2
Return System.Drawing.Color.FromArgb(165, 15, 15)
Case 3
Return System.Drawing.Color.FromArgb(249, 187, 19)
Case 4
Return System.Drawing.Color.FromArgb(255, 231, 69)
Case 5
Return System.Drawing.Color.FromArgb(4, 152, 19)
Case 6
Return System.Drawing.Color.FromArgb(101, 196, 253)
Case 7
Return System.Drawing.Color.FromArgb(2, 33, 160)
Case 8
Return System.Drawing.Color.FromArgb(72, 0, 168)
Case 9
Return System.Drawing.Color.FromArgb(0, 0, 0)
Case 10
Return System.Drawing.Color.FromArgb(150, 150, 150)
Case 11
Return System.Drawing.Color.FromArgb(192, 192, 192)
Case 12
Return System.Drawing.Color.FromArgb(255, 255, 255)
Case 13
Return System.Drawing.Color.FromArgb(243, 217, 243)
Case 14
Return System.Drawing.Color.FromArgb(255, 225, 161)
Case 15
Return System.Drawing.Color.FromArgb(241, 238, 207)
Case 16
Return System.Drawing.Color.FromArgb(199, 255, 215)
Case 17
Return System.Drawing.Color.FromArgb(199, 234, 255)
Case 18
Return System.Drawing.Color.FromArgb(213, 194, 254)
End Select
End Function 'creaColore
''' <summary>
''' Scrive nel campo di competenza il tasto digitato dall'utente,
''' opportunamente trattato
''' </summary>
''' <param name="campo"></param>
''' <param name="tasto"></param>
''' <param name="posizione"></param>
''' <param name="svuota"></param>
''' <remarks></remarks>
Sub scriviCampi(ByVal campo As TextBox, ByVal tasto As Char, ByVal posizione As Integer, ByVal svuota As Boolean)
If (Not campo Is Nothing) Then
If svuota Then campo.Text = String.Empty
campo.Text = Mid(campo.Text, 1, posizione - 1) & tasto & Mid(campo.Text, posizione)
campo.Text = Mid(campo.Text, 1, campo.MaxLength)
campo.Focus()
campo.SelectionStart = posizione
End If
End Sub 'scriviCampi
End Module
Public Class FormFreezer
Implements IDisposable
' The form being frozen
Dim Form As Form
' the auxiliary PictureBox that will cover the form
Dim PictureBox As PictureBox
' the number of times the Freeze method has been called
Dim FreezeCount As Integer = 0
' create an instance associated with a given form
' and optionally freeze the form right away
Public Sub New(ByVal form As Form, Optional ByVal freezeIt As Boolean = False)
Me.Form = form
If freezeIt Then Me.Freeze()
End Sub
' freeze the form
Public Sub Freeze()
' Remember we have frozen the form once more
FreezeCount += 1
' Do nothing if it was already frozen
If FreezeCount > 1 Then Exit Sub
' Create a PictureBox that resizes with its contents
PictureBox = New PictureBox()
PictureBox.SizeMode = PictureBoxSizeMode.AutoSize
' create a bitmap as large as the form's client area and with same color depth
Dim frmGraphics As Graphics = Form.CreateGraphics()
Dim rect As Rectangle = Form.ClientRectangle
PictureBox.Image = New Bitmap(rect.Width, rect.Height, frmGraphics)
frmGraphics.Dispose()
' copy the screen contents, from the form's client area to the hidden bitmap
Dim picGraphics As Graphics = Graphics.FromImage(PictureBox.Image)
picGraphics.CopyFromScreen(Form.PointToScreen(New Point(rect.Left, rect.Top)), New Point(0, 0), New Size(rect.Width, rect.Height))
picGraphics.Dispose()
' Display the bitmap in the picture box, and show the picture box in front of all other controls
Form.Controls.Add(PictureBox)
PictureBox.BringToFront()
End Sub
' unfreeze the form
' Note: calls to Freeze and Unfreeze must be balanced, unless force=true
Public Sub Unfreeze(Optional ByVal force As Boolean = False)
' exit if nothing to unfreeze
If FreezeCount = 0 Then Exit Sub
' remember we've unfrozen the form, but exit if it is still frozen
FreezeCount -= 1
' force the unfreeze if so required
If force Then FreezeCount = 0
If FreezeCount > 0 Then Exit Sub
' remove the picture box control and clean up
Form.Controls.Remove(PictureBox)
PictureBox.Dispose()
PictureBox = Nothing
End Sub
' return true if the form is currently frozen
Public ReadOnly Property IsFrozen() As Boolean
Get
Return FreezeCount > 0
End Get
End Property
' ensure that resources are cleaned up correctly
Public Overridable Sub Dispose() Implements IDisposable.Dispose
Me.Unfreeze(True)
End Sub
End Class |
===============================================
Ti ringrazio di Cuore.......... |
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 24 Feb 2010 21:42 Oggetto: |
|
|
Scusa, rinfrescami un po' la memoria...
Del codice che hai scritto, qual'è la funzione che chiami da cobol?
Il punto è che se la funzione che viene chiamata è quella che genera la maschera, finchè questa non si chiude il controllo non ritorna a questa e quindi il ritorno va a farsi benedire.
Bisognerebbe riuscire ad implementare un meccanismo di questo tipo:
Codice: |
1) cobol chiama la funzione della dll
2) la funzione viene eseguita in un thread (detto [1]) e la maschera vera e propria viene gestita in un altro thread detto [2]
3) il thread [1] ascolta il [2] e quando premi invio esegue il ritorno
|
In pratica bisogna scorporare il processo "maschera" da quello della funzione chiamata nella dll in modo da avere la maschera libera di farsi i suoi; finchè non si preme invio [1] deve stare in un loop a far nulla.
Devo pensarci però ancora un po' anche perchè non è sia la classica cosa da fare dopo cena...
Oppure, sei costretto ad usare questo approccio?
Non è possibile far sì che la maschera venga generata e poi sia lei a spedire a cobol la roba? (e non cobol che aspetti il ritorno).
Io cobol non lo conosco tranne che per fama (x me negativa) quindi cosa possa fare non lo so di preciso.
Se cobol può esporre dei servizi o roba simile potresti ragionare come appena sopra: in pratica la maschera sarebbe come un programmino a parte che si preoccupa di inviare le cose all'altro programma. |
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 24 Feb 2010 22:07 Oggetto: |
|
|
Altra idea anche se:
1) acucobol deve poter gestire i socket
2) la portabilità della dll va un po' a ramengo
1) Cobol chiama la dll che genera la form e apre un socket
2) la form quando premi invio scrive nel socket
3) cobol si legge le cose, fa quello che deve e poi si rimette in ascolto del socket
4) magari ci si inventa qualche cosa per tener sincro le cose, ossia evitare di avere il socket chiuso ma la maschera aperta.
Che dici? |
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 25 Feb 2010 01:32 Oggetto: |
|
|
Un amico che ha lavorato con acucobol e ora con vb non è molto convinto che la cosa funzioni...
Domanda: ma perchè passi per una dll in vb? La maschera non la puoi creare con cobol? |
|
Top |
|
 |
rickyrey Mortale devoto

Registrato: 08/02/10 15:32 Messaggi: 5 Residenza: pavia
|
Inviato: 25 Feb 2010 12:17 Oggetto: Richiamo Funzione vb 2008 da acucobol |
|
|
Purtroppo abbiamo vincoli specifici, quindi siamo costretti ad usare sia cobol che vb; mi attira la soluzione dei 2 thread, mentre la socket la escluderei a priori (soluzione già provata in precedenza con esiti disastrosi).
Non mi è però molto chiara la domanda che poni:
Citazione: | Non è possibile far sì che la maschera venga generata e poi sia lei a spedire a cobol la roba? (e non cobol che aspetti il ritorno). |
In che senso? Di fatto è proprio così: cobol chiama la funzione vb che mette a video la maschera e rimane in attesa dell'input digitato dall'utente;solo quando l'utente ha finito di inserire l'input, la funzione vb costruisce la stringa di risposta e la invia a cobol. Certo, nell'ottica dei due thread separati probabilmente dovrebbero essere due oggetti separati a generare la maschera e restituire l'input acquisito, ma si tratterebbe pur sempre di oggetti vb, cobol non farebbe altro che restare in attesa (in questa fase) della stringa di ritorno. Il problema sorge(va) nel momento in cui la maschera deve restare a video dopo aver rispedito la stringa di "risposta".
Qualche suggerimento su come implementare le due parti (cobol e vb) in modo che si parlino correttamente?
Grazie |
|
Top |
|
 |
|
|
Non puoi inserire nuovi argomenti Non puoi rispondere a nessun argomento Non puoi modificare i tuoi messaggi Non puoi cancellare i tuoi messaggi Non puoi votare nei sondaggi
|
|