Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Tiedon siirto QB <-> VB (VB6)

Sivun loppuun

setä [23.01.2007 11:56:14]

#

QB:ssä on kiinnostavia ominaisuuksia, kuten tuo Antin koodivinkki muistiin tallennetusta luvusta. VB:ssä ei ole PEEK- eikä vastaavaa POKE-käskyä. Jos VB:llä käynnistää QB-ohjelman voiko muuttujien sisältöä siirtää toiseen ohjelmaan jotenkin suoraan parametreina vai onnistuuko PEEK ja POKE VB:ssä jollain API-funktiolla?

E.K.Virtanen [23.01.2007 22:51:05]

#

Aikamoista kikkailua vaatii. Tiedän erään joka jonkinlaisen tällaisen tekikin (muistaakseni) mutta hän näyttää olevan off linessa. Voin kysäistä kun näen.

Etkö voisi käyttää tiedostossa siirtämistä? Kävisi varmaan hieman helpommalla.

setä [24.01.2007 08:32:14]

#

Noin teen jos ei parempaa konstia löydy.

BadSource [24.01.2007 09:03:03]

#

SendMessage API:lla onnistuu. En tähän hätään löytänyt googlella esimerkkiä asiasta, mutta mulla on tuosta oma versioni kotona jossain tallessa, jossa kaksi erillistä VB:llä tehtyä ohjelmaa juttelee keskenään. Kai tuo on mahdollista muokata myös QB:llä toimivaksi. Voin laittaa koodin jonnekkin kopioitavaksi, kun pääsen illalla kotiin.

setä [25.01.2007 19:27:55]

#

Jospa BadSource löytäisit oman versiosi SedMessage API:sta olisin hyvin kiitollinen.

Metabolix [25.01.2007 19:39:41]

#

Uskaltaisin kyllä väittää, ettei QB:llä toimi WinAPI.

setä [25.01.2007 19:49:37]

#

Kiinnostaisi tuo tiedon siirto vaikka vain VB-ohjelmien kesken.

BadSource [29.01.2007 14:22:06]

#

Nyt on pää niistetty tyhjäksi, joten alkaa muistikin palata pätkittäin.

Tuossa linkki kaivattuun esimerkkiin. Googlella asiasta löytää esimerkkejä mm. hakusanoilla vb VB_WindowProc, joiden pohjalta tuon omani olen joskus askarrellutpaskarrellut.

setä [29.01.2007 15:48:40]

#

Kiitokset vastauksista ja esimerkistä.

neau33 [29.01.2007 17:24:38]

#

Heippa!

Hieman mietityttää toi VB - QB jutska, koska toi API SendMessage tai vaikka DDE-linkityksen onnistuminen perustuu siihen että vastaanottavan ohjelman johokin kontrolliin saadaan yhteys.
Esim. AppActivate "Title": SendKeys "{TAB}" jne...
Mutta mistä löytyy QB:ssä se kontrolli johon luoda yteys/josta napata kahva?

Sen sijaan WriteMemory()/ReadMemory() -funktioilla voisi ehkä kikkailla VB:ssä ja QB:ssä vaikkapa Open "COM..., Call Absolute(), OUT(), & INP()-funktioilla

setä [29.01.2007 23:02:19]

#

Kiitos Nea mutta taisin iskeä kirveeni kiveen. Kunnioitettavan näköisiä esimerkkejä mutta menee turhan mutkikkaaksi todellakin. Tyydyn siirtoon tietoston kautta.

BadSource [30.01.2007 07:32:18]

#

lainaus:

Mutta mistä löytyy QB:ssä se kontrolli johon luoda yhteys/josta napata kahva?

Tunnen QB:tä varsin huonosti, mutta esimerkissäni tuota varten luodaan erilinen formi, jonka kahva toimii SendMessagen kahvana. CreateWindowEx palauttaa suoraan luomansa ikkunan kahvan onnistuneen kutsun yhteydessä. HInstancea tarvitaan kohteena, johon CreateWindowEx sitoo luomansa ikkunan. HInstancen taas saa selville GetModuleHandle API:lla, jos QB ei sitä suoraan tunne/palauta.

'VB-esimerkki GetModuleHandlen käytöstä
Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (Optional ByVal lpModuleName As String) As Long

Dim hInstance As Long

'jos moduulia ei nimetä, niin GetModuleHandle palauttaa kutsujan hInstancen
hInstance = GetModuleHandle 'VB:llä App.hInstance

FindWindow API antaa halutun ikkunan kahvan, jos tämän otsikko tiedetään, jolloin toinen ohjelma osaa etsiä kenelle viestinsä lähettää.

Toisin sanoen, jos QB:ssä pystyy kerran tekemään API-kutsuja, niin kahva ei ole mikään ongelma.

moptim [30.01.2007 09:01:34]

#

Hm. Ei luultavimmin pysty. Kirjastot pitäisi linkata myös .qlb / .bi -tiedostoiksi. QB on DOSille. Sitten voi tietenkin antaa parametrinä komennon ja arvot. Veikkaanpa, että joudut joko antamaan parametreinä asiaa tai sitten tallentamaan tiedostoon.

neau33 [30.01.2007 16:40:52]

#

Heippa taas!

Jos nyt välttämättä haluaa välttää tiedoston käyttöä QB <-> VB väliseen tiedonsiirtoon niin siirron voisi toteuttaa esim. sarjaportin kautta.

Ekaks olis hyvä rakennella loopback plugi

'QB esimerkki:
DECLAREC SUB KirjoitaPorttiin(): DECLAREC SUB LuePortista()

DIM SHARED tavut AS INTEGER, COM$

tavut = 2 * 8
Paluu:

CLS: LOCATE 1, 1: INPUT "Valitse COM portti (1 tai 2): "; portti%
 SELECT CASE portti%
  CASE 1
   COM$ = "COM1"
  CASE 2
   COM$ = "COM2"
  CASE ELSE
  CLS: LOCATE 1, 1: PRINT "Virheellinen arvo! Jatkatko K/E?"
  DO
   SELECT CASE UCASE$(INKEY$)
    CASE "K": GOTO Paluu
    CASE "E": CLS: SYSTEM
   END SELECT
  LOOP
 END SELECT

  CLS: Ohje
 DO
  SELECT CASE UCASE$(INKEY$)
   Case "A": GOTO Paluu
   CASE "L": LuePortista
   CASE "K": KirjoitaPorttiin
  END SELECT
 LOOP UNTIL INP(&H60) = 1
 CLS: SYSTEM

SUB KirjoitaPorttiin()
 CLS
 LOCATE 1, 1: PRINT "LUKUARVON SYÖTTÖ:   Paina L"
 LOCATE 2, 1: PRINT "MERKKIJONON SYÖTTÖ : Paina M"

 DO
  SELECT CASE UCASE(INKEY$)
   DIM dataStr AS STRING
   CASE "L": INPUT "Lukuarvo: "; xdata&: dataStr = LTRIM$(STR$(xdata&))
   EXIT DO
   CASE "M": INPUT$ "Merkkijono: "; dataStr
   IF dataStr <> "" THEN dataStr = dataStr + SPACE$(tavut - LEN(dataStr))
   EXIT DO
   CASE ELSE: BEEP
  END SELECT
 LOOP

  IF LEN(dataStr) > tavut THEN dataStr = LEFT$(dataStr, tavut)

 OPEN COM$ + ":9600,N,8,1,RS,DS" FOR RANDOM ACCESS WRITE AS #1 LEN = tavut
  PUT #1, 1, dataStr: CLOSE #1 CLS: ohje
END SUB

SUB LuePortista()
 DIM dataStr AS STRING
 CLS
 OPEN COM$ + ":9600,N,8,1,RS,DS" FOR RANDOM ACCESS READ AS #1 LEN = tavut
  GET #1, 1, dataStr: CLOSE #1 :LOCATE 3, 1
  PRINT COM$ +" DATA: " + dataStr
  Ohje
END SUB

SUB ohje()
 LOCATE 1, 1
 PRINT "Alkuun=A kirjoita porttiin=K Lue portista=L Sulje=Esc"
END SUB
' HUOM! älä kopioi tätä koodia suoraan QBasic'iin

Tässä vielä mielenkiintoinen linnki

VB:ssä vois sit käytellä MSComm-kontrollia, jonka toiminnoista löytyy tietoa raahaamalla kontrolli formille, aktivoimalla & painamalla F1-näppäintä.

setä [30.01.2007 20:32:47]

#

Kiitos Nea. Tietoa löytyy niin että nuppia pakottaa.

neau33 [30.01.2007 20:34:30]

#

Heippa taas!

Tiedos­to­ta­sol­la ­teh­ty ­siir­to ­voi­si ol­la ­vaik­ka­pa ­täl­läi­nen...

'QB ohjelma (C:\HelloVB.Bas)

DECLARE SUB WriteData(): DECLARE SUB ReadData(): DECLARE SUB HelpText()
COMMON SHARED stringi$, lyhyt%, lonkku&, sinkku!, tupla#, visiitti%
DIM SHARED QbCrLf AS STRING
 QbCrLf = CHR$(10) + CHR$(13)
 HelpText

 IF visiitti =  1 THEN
  visiitti = 0
  LOCATE 2,1: PRINT "stringi$ = " + stringi$
  LOCATE 3,1: PRINT "lyhyt%   = " + TRIM$(STR$(lyhyt%))
  LOCATE 4,1: PRINT "lonkku&  = " + TRIM$(STR$(lonkku&))
  LOCATE 5,1: PRINT "sinkku   = " + TRIM$(STR$(sinkku!))
  LOCATE 6,1: PRINT "tupla#   = " + TRIM$(STR$(tupla#))
 END IF
 
DO
 SELECT CASE UCASE$(INKEY$)
  CASE "R": SendData
  CASE "W": ReadData
  CASE ELSE: BEEP
 END SELECT
LOOP UNTIL INP(&H60) = 1 'Esc
CLS: SYSTEM

SUB ReadData)
 ON ERROR GOTO ErrorHandler
 CHAIN "C:\HelloQB.Bas"
 EXIT SUB
ErrorHandler:
 ERR = 0
 Msg$ = "File doesn't exists!"
 LOCATE 13, 40 - (LEN(Msg$) / 2): PRINT Msg$
 RESUME NEXT
END SUB

SUB WriteData()

  Scripti$ = "Sub Scripti()" + QbCrLf 
  Scripti$ = Scripti$ + "stringi$ = " + Chr$(34) + "Hello VB!" + CHR$(34) + QbCrLf 
  Scripti$ = Scripti$ + "lyhyt% = 1000 * 1000" + QbCrLf 
  Scripti$ = Scripti$ + "lonkku& = 1000000 * 1000000" + QbCrLf 
  Scripti$ = Scripti$ + "sinkku! = 1000.0001 * 1000.0001" + QbCrLf 
  Scripti$ = Scripti$ + "tupla# = 1000000.0000001 * 1000000.0000001" + QbCrLf 
  Scripti$ = Scripti$ + "End Sub"
  OPEN "C:\HelloVB.txt" For OUTPUT AS #1: PRINT #1, Scripti$: CLOSE #1
END SUB

SUB HelpText()

 Header$ = "R=Read data W=Write data Esc=Quit"
 CLS: LOCATE 1, 40 - (LEN(Header$) / 2): PRINT Header$
END SUB
'VB Ohjelma (HelloQB.vbp - HelloQB.frm)

'Lisää referenssit: Microsoft Script Control 1.0 
'sekä Microsoft Scripting Runtime Library

Public stringi$, lyhyt%, lonkku&, sinkku!, tupla#

Private Sub cmdReadData()

 Dim sc As MSScriptControl.ScriptControl
 Dim fso As FileSystemObject
 Set fso = New FileSystemObject
 If fso.FileExists("C:\HelloVB.txt") Then

 Dim ScriptStr As String
 Set sc = New MSScriptControl.ScriptControl
  Open "C:\HelloVB.txt" For Input As #1
  ScriptStr = Input$(LOF(1), 1): Close #1
  With sc
    .Language = "VBScript"
    .AddObject "Form1"MeTrue
    .AllowUI = True
    .AddCode ScriptStr
    .Run "Scripti"
  End With
  Set sc = Nothing
 Else
  MsgBox "File doesn't exists", VbExclamation, Me.Caption
 End if
 Set fso = Nothing
End Sub

Private Sub cmdShowData_Click()

 Static i As Integer
 Select Case i
  Case 0
   Text1.Text = stringi$: i = i + 1Exit Sub
  Case 1
   Text1.Text = lyhyt%: i = i + 1Exit Sub
  Case 2
   Text1.Text = lonkku&: i = i + 1Exit Sub
  Case 3
   Text1.Text = sinkku!: i = i + 1Exit Sub
  Case 4
   Text1.Text = tupla#: i = 0Exit Sub
 End Select
End Sub

Private Sub cmdWrite()

 Open "C:\HelloQB.Bas" For Output As #1
 Print #1"COMMON SHARED stringi$, lyhyt%, lonkku&, sinkku!, tupla#, visiitti%" & vbCrLf _
"visiitti% = 1" & vbCrLf _
"stringi$ = Chr(34) & "Hello QB" & Chr(34) & vbCrLf" _
"lyhyt% = 2000 / (1 / 2000)" & vbCrLf _
"lonkku& = 2000000 / (1 / 2000000)" & vbCrLf _
"sinkku! = 2000.0001 / (1 / 2000.0002)" & vbCrLf _
"tupla# = 2000000.000002 / (1 /2000000.0000002)" & vbCrLf _
"CHAIN " & Chr(34) & "C:\HelloVB.Bas" & Chr(34)
End Sub

setä [30.01.2007 22:45:14]

#

Kiitoksia paljon. Tässä riittää sulateltavaa.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta