abonnement Unibet Coolblue Bitvavo
  maandag 3 januari 2011 @ 19:57:24 #151
85514 ralfie
!Yvan eht nioj
pi_90807434
quote:
1s.gif Op maandag 3 januari 2011 19:06 schreef Modus het volgende:
Ik ben met een studieopdracht bezig. Een simpel programmaatje om een soort orderlijst te maken en daarnaast moet je nog een programma maken om die orderlijst te veranderen. Ik moet dus 2 .exe's maken (kan ms ook anders maar het voorbeeld heeft er ook 2).

Min of meer de enige hint die gegeven werd voor het samen gebruiken van die 2 is dat VB (Express in mijn geval) een Process component in de toolbox heeft. Ik heb echter geen idee hoe en wat verder, als ik zo'n ding in mijn eerste programma toevoeg.

In prog 1 zit een knop Edit orderlist die prog 2 laat opstarten. Ik heb echt geen idee wat voor code ik ongeveer zou moeten gebruiken onder die knop om dat voor elkaar te krijgen. En als ik wel code heb, wat is dan het nut van dat component in mijn project??

Verder is dus het idee dat gegevens uit prog 2 weer verwerkt worden in prog 1. Ook geen idee hoe dat zou moeten (variabelen binnen meerdere forms snap ik wel), of gaat dat min of meer 'automatisch' door juist gebruik van dit onderdeel?

Heb hier al wat zitten kijken http://msdn.microsoft.com(...)nostics.process.aspx maar daar word ik niet heel veel wijzer van vooralsnog.
dat lijkt me vb.net en dat is iets waar de meeste mensen in dit topic allergisch voor zijn.
En gelijk hebben ze

met een process kun je (zo te zien) vrij makkelijk standardinput en standardoutput redirecten. Daarmee kun je nogal wat data snel over en weer hevelen. Dat zou mijn eerste keus zijn denk ik.

Anders, tjah, moeten het echt twee verschillende programma's zijn? Shared memory e.d. lijkt me tamelijk geavanceerd voor iemand die je durft in vb.net te laten leren. Maar je zult wel moeten als het het netjes wilt doen. Anders kun je het nog met Send/PostMessage, winapi's en het vieze 'een bestandje waarin beide programma's lezen en schrijven'.
pi_90808230
Ja je moet gewoon het voorbeeldprogramma functioneel namaken, de enige hint die ik voor dit gedeelte kreeg was die Process component. Ms denk ik wel veel te moeilijk en is het een kwestie van prog 2 laten opstarten vanuit prog 1 (met een beetje kloten lukt me dat nog wel denk ik) maar wat is dan nog de bedoeling van dat component in je form inbouwen??

Ms voor het plaatje, prog 2 leest een text bestand in dat eerst door prog 1 gevuld is. Dat txtbestand kun je dan wijzigen, na afsluiten van prog 2 worden de nieuwe gegevens weer in prog 1 verwerkt.

Deze opdracht is echt bizar veel moeilijker dan alle voorgaande en je krijgt alleen maar een paar trefwoorden als hulp zeg maar.
  maandag 3 januari 2011 @ 21:20:20 #153
192481 Core2
Happiness is the road
pi_90812166
Misschien zoiets?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        If Environment.GetCommandLineArgs.Contains("edit") Then
            Dim orders As New List(Of String)
            Dim order As String = Nothing

            Do
                order = Console.ReadLine
                If order <> String.Empty Then orders.Add(order)
            Loop While Not order = String.Empty

            MessageBox.Show(orders.Count)
        Else
            Dim orderLijst As String() = {"cola", "boter", "kaas", String.Empty}

            Dim si As New System.Diagnostics.ProcessStartInfo With {
                .Arguments = "edit",
                .FileName = Application.ExecutablePath,
                .RedirectStandardInput = True,
                .UseShellExecute = False
            }

            Dim process = System.Diagnostics.Process.Start(si)

            process.WaitForInputIdle()

            For Each order In orderLijst
                process.StandardInput.WriteLine(order)
            Next

            process.StandardInput.Flush()
        End If
    End Sub
  maandag 3 januari 2011 @ 21:28:13 #154
192481 Core2
Happiness is the road
pi_90812632
Het is dan ook niet zo moeilijk meer om van B naar A te gaan lijkt me. Je kunt dus communiceren via stdin/stdout. Je hebt nog wel wat andere mogelijkheden (named pipes, memory mapped files, tcp/ip, etc) waar je denk ik nog wat te weinig ervaring voor hebt (met alle respect :) ).
pi_90813853
Het zal wel een beetje in die richting gaan zoals jouw code, maar ik kan me gewoon niet voorstellen dat dat de bedoeling is... 1 trefwoord 'Process' en dan moet je bovenstaande er zelf maar bij uitzoeken...
pi_90826470
Ik denk dat ik veel te moeilijk dacht in eerste instantie. Volgens mij is het de bedoeling dat ik vanuit prog 1 prog 2 laat opstarten, die laatste gegevens laat verwerken in het textbestandje, prog 2 weer sluiten en vervolgens prog 1 de vernieuwde gegevens weer laten uitlezen uit dat textbestandje. Op die manier is er dus geen sprake van rechtstreeks overdracht tussen 2 exe's.
  dinsdag 4 januari 2011 @ 14:39:39 #157
58834 Catbert
The evil HR Director.
pi_90836160
quote:
1s.gif Op maandag 3 januari 2011 21:28 schreef Core2 het volgende:
Het is dan ook niet zo moeilijk meer om van B naar A te gaan lijkt me. Je kunt dus communiceren via stdin/stdout. Je hebt nog wel wat andere mogelijkheden (named pipes, memory mapped files, tcp/ip, etc) waar je denk ik nog wat te weinig ervaring voor hebt (met alle respect :) ).
Volgens mij is het gewoon de bedoeling dat ze die data in een textfile of DB opslaan. Snap niet dat mensen hier rare oplossingen als communicerende applicaties gaan bedenken. In VB wat in een access DB frutten is triviaal.
"[...] a large number of the teenagers claiming Asperger's are, in fact, merely dicks."
  dinsdag 4 januari 2011 @ 21:21:02 #158
192481 Core2
Happiness is the road
pi_90855133
quote:
1s.gif Op dinsdag 4 januari 2011 14:39 schreef Catbert het volgende:

[..]

Volgens mij is het gewoon de bedoeling dat ze die data in een textfile of DB opslaan. Snap niet dat mensen hier rare oplossingen als communicerende applicaties gaan bedenken. In VB wat in een access DB frutten is triviaal.
Je kunt die opdracht op meerdere manieren interpreteren, ik heb geen idee wat de context is. Er wordt gesproken over het Process object, een orderlijst en twee applicaties die iets met die orderlijst moeten doen. Niet zo gek dat je dan bij communicerende processen uitkomt, maar zou me niks verbazen als ze inderdaad een database oplossing bedoelen.
pi_90862416
Even voor de duidelijkheid: het voorbeeldprogramma is wel zo duidelijk dat er geen twijfel is over het moeten gebruiken van een textfile. App 1 is een soort orderprogramma en schrijft op de achtergrond gegevens weg in dat text bestand en wil je wat wijzigen daarin dan moet dat via app 2.

Ik zat bij mijn eerste post verkeerd te denken, nl. ongeveer dit:

-app2 starten en daarmee
-wijzigingen in text file opslaan
-app 2 weer sluiten

ik was in de veronderstelling dat die gewijzigde gegevens alleen naar app1 'overgeheveld' zouden kunnen worden door ze in arrays ofzo te verwerken, en ik zag gewoon niet (als dat al kan) hoe dat zou moeten, dat overdragen tussen 2 exes. Dat zou ook nog heel veel ingewikkelder zijn dan wat ik tot nu toe in de lesstof gezien heb, dus kon me al nauwelijks voorstellen dat dat de bedoeling zou zijn.

Ik moet het nu nog uitwerken maar wat ik volgens mij moet doen is:

-app 2 opstarten
-wijzigingen opslaan
-app 2 weer afsluiten en in diezelfde event zorgen dat app 1 meteen daarna de nieuwe gegevens uit dat textbestand weer inleest en verwerkt in o.a. het prijzengedeelte.

Verder werd dus bij de tips gesproken over de Process class, met een miniem stukje code als voorbeeld, en daarna werd gerefereerd naar het aanwezig zijn van een Process component in VB die je gewoon in je form kan slepen en wat blijkbaar 1 en ander zou vereenvoudigen. Hoe ik die component dan zou moeten gebruiken is me nog niet helemáál duidelijk, met alleen die code kom ik er eerder uit denk ik.

Hoop dat zo een beetje duidelijk is wat de bedoeling van de opdracht is en daarmee van mijn vraagstelling.
pi_99643911
Na vastlopen en ander geneuzel de studieopdracht maar weer opgepakt.
Waar ik nog steeds mee zit is:

Is mijn denkwijze überhaupt wel goed voordat we ook maar aan code gaan denken (zie ook mijn post hierboven). Is het mogelijk om in App2 het 1 en ander te doen (terwijl App1 dan op de achtergrond 'wacht'), dat vervolgens af te sluiten waarna App1 weer 'actief' wordt maar op het moment van actief worden moet er in App1 ook het 1 en ander gebeuren (gegevens bijgewerkt, een soort 'refresh' zeg maar). Kan ik überhaupt elementen in App1 rechtstreeks aanroepen vanuit App2? Zo nee, dan moet er dus iets gebeuren zodra App2 klaar is. Maar hoe laat ik App1 weten dat App2 klaar is??

Kan het niet duidelijker verwoorden... hoop dat iemand tips heeft. Heb de docent ook nog maar eens gemaild maar daar krijg ik altijd als het meezit 3 woorden antwoord van.
  woensdag 20 juli 2011 @ 15:08:18 #161
15929 DiRadical
Everything's ruined
pi_99706163
Eerste hit in Google
kom uit bij About.com

Je kunt vanuit App1 een nieuw proces met applicatie App2 starten.
Als je een textbestand hebt opgeslagen in App1 kun je die meegeven als parameter en deze parameter weer uitlezen in App2.
In App2 kun je je bewerking uitvoeren en opslaan (in hetzelfde tekst bestand)
Daarna kun je App2 sluiten.

Door myProcess.WaitForExit() toe te voegen aan de code nadat je myProcess gestart bent wordt het uitvoeren van de rest van de code van App1 gestopt.
Daarna kun je in App1 het bestand weer openen en de wijzigingen inlezen.
Happyness is nature's way of informing human resources that you're overpaid
-Catbert: Evil director of HR
pi_100208939
Thanks, had je reply nog niet gezien. Ik heb dat stukje inmiddels ook werkend kunnen krijgen. Ben inmiddels weer iets verder gevorderd.

Nu wat anders, een wat specifieker probleem, dus ms makkelijker om uit te zoeken.
Na het sluiten van App2 laat ik het txt-bestand opnieuw openen, dat moet regel voor regel uitgelezen worden, elke regel moet opgesplitst naar een array en het eerste item van deze array moet als zoekterm gebruikt worden om in de Listbox van App1 het bijbehorende item terug te vinden.

Leek allemaal goed te gaan maar het juiste Listbox.Item wordt niet goed bijgewerkt. Nader onderzoek leert dat die array vullen niet goed gaat, maar ik zie niet wat ik daar fout aan doe. Heb ongeveerd e volgende code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Dim File_Name As String = "D:\vb08sbs\voorbeelden\899J6\Inzending\899Q6\orders.txt"
            If System.IO.File.Exists(File_Name) = True Then
                Dim SplitLineArr() As String, NewTextLine As String
                Dim objReader As New System.IO.StreamReader(File_Name)
                Do While objReader.Peek() <> -1
                    NewTextLine = objReader.ReadLine()
                    SplitLineArr = Split(objReader.ReadLine(), ";")
                    Label5.Text = NewTextLine
                    Label6.Text = SplitLineArr(0)

                    ' Dim index As Integer = OrderListBox.FindString(SplitLineArr(0))
                    ' If index <> -1 Then
                    ' OrderListBox.Items(index) = NewTextLine
                    ' ArticlePrice = Convert.ToDecimal(Trim(SplitLineArr(2)), New System.Globalization.CultureInfo("en-US"))
                    ' TotalPrice = TotalPrice + (Trim(SplitLineArr(3)) * ArticlePrice)
                    ' End If
                Loop
            End If
Er staat wat overbodige code in maar die gebruik ik gedeeltelijk om waardes uit te lezen, zoals de labels5 en 6.
Als er maar 1 regel in het textbestand staat, verschijnt in label5 wel text, maar in 6 niet. Staan er meer regels in het textbestand dan blijven zowel label5 als 6 leeg.

Zit dat hem wellicht in hoe het textbestand uitgelezen wordt? Is er een andere manier om regel voor regel uit te lezen?
pi_100212540
quote:
0s.gif Op maandag 1 augustus 2011 21:26 schreef Modus het volgende:
Thanks, had je reply nog niet gezien. Ik heb dat stukje inmiddels ook werkend kunnen krijgen. Ben inmiddels weer iets verder gevorderd.

Nu wat anders, een wat specifieker probleem, dus ms makkelijker om uit te zoeken.
Na het sluiten van App2 laat ik het txt-bestand opnieuw openen, dat moet regel voor regel uitgelezen worden, elke regel moet opgesplitst naar een array en het eerste item van deze array moet als zoekterm gebruikt worden om in de Listbox van App1 het bijbehorende item terug te vinden.

Leek allemaal goed te gaan maar het juiste Listbox.Item wordt niet goed bijgewerkt. Nader onderzoek leert dat die array vullen niet goed gaat, maar ik zie niet wat ik daar fout aan doe. Heb ongeveerd e volgende code:
[ code verwijderd ]

Je leest nu door deze code steeds twee regels uit het bestand.
1
2
NewTextLine = objReader.ReadLine()
SplitLineArr = Split(objReader.ReadLine(), ";")

Van die tweede regel zou je dus eigenlijk dit moeten maken:
1SplitLineArr = Split(NewTextLine , ";")
pi_100212927
Is dat zo? Alles wat binnen de Do While-Loop code valt gaat toch over dezelfde regel?

Heb de code aangepast zoals je aangeeft en dan gebeurt er nog steeds niks, label5 en 6 blijven leeg.
pi_100213586
quote:
0s.gif Op maandag 1 augustus 2011 22:46 schreef Modus het volgende:
Is dat zo? Alles wat binnen de Do While-Loop code valt gaat toch over dezelfde regel?
Het enige wat deze Do zegt is dat er code moet worden uitgevoerd zolang er nog tekst te vinden is in het bestand. Met .Peek() kijk je namelijk naar de volgende regel, hij wordt dan nog niet gelezen, dat gebeurd pas met .ReadLine() die je twee keer aanroept :)
quote:
Heb de code aangepast zoals je aangeeft en dan gebeurt er nog steeds niks, label5 en 6 blijven leeg.
Ah, maar dan gebeurd er dus wel wat anders dan net! :P Dat is iets anders dan "nog steeds niets" ;)
Dat nu ook label5 leeg blijft kan worden veroorzaakt doordat het tekstbestand wat je inleest een witregel aan het einde heeft o.i.d., heb je daar al naar gekeken?

Kan je eenvoudig controleren in notepad of door een breakpoint aan het begin van je code neer te zetten en dan stap-voor-stap elke regel te evalueren en in je variabelen te kijken.
  maandag 1 augustus 2011 @ 23:03:38 #166
44920 TallMan
Permanent brain failure
pi_100213867
Probeer inderdaad met breakpoints door je code te stappen en kijk wat er specifiek misgaat, welke variabele wordt niet gevuld zoals jij dacht.

Dat je niets ziet gebeuren kan heel goed aan een witregel liggen aan het einde van de textfile zoals al was genoemd. Je labels zullen visueel niet worden geupdate zolang je nog in je Do lus zit (behalve als je dat zelf afdwingt) dus dat je daaraan niets ziet is by design.

Klein puntje is dat een StreamReader een EndOfStream property heeft. Die kun je gebruiken ipv die Peek <> -1

1
2
3
4
5
6
7
8
9
10
11
12
13
                Do While not objReader.EndOfStream
                    NewTextLine = objReader.ReadLine()
                    SplitLineArr = Split(NewTextLine, ";")
                    Label5.Text = NewTextLine
                    Label6.Text = SplitLineArr(0)

                    ' Dim index As Integer = OrderListBox.FindString(SplitLineArr(0))
                    ' If index <> -1 Then
                    ' OrderListBox.Items(index) = NewTextLine
                    ' ArticlePrice = Convert.ToDecimal(Trim(SplitLineArr(2)), New System.Globalization.CultureInfo("en-US"))
                    ' TotalPrice = TotalPrice + (Trim(SplitLineArr(3)) * ArticlePrice)
                    ' End If
                Loop
geheelonthouder met geheugenverlies
Mensen die zeggen dat domme vragen niet bestaan stellen ze zelf.
pi_100214138
Bij het creëren en vullen van dat tekstbestand wordt idd elke keer een enter aan het einde van een weggeschreven regel toegevoegd, heb het idee dat het daar iets mee te maken heeft ja. Als ik het open en naar het einde van het bestand ga, kom ik uit onder de tekstregels, aan het begin van een nieuwe regel.

Is er een manier om dat tijdens het wegschrijven al te voorkomen, of moet je iets doen waardoor je na de laatste regel de nieuwe lege regel weer delete o.i.d.? Die enter moet natuurlijk wel gebruikt worden om telkens regels onder elkaar in het textbestand te kunnen krijgen...?
pi_100215234
quote:
0s.gif Op maandag 1 augustus 2011 23:10 schreef Modus het volgende:
Bij het creëren en vullen van dat tekstbestand wordt idd elke keer een enter aan het einde van een weggeschreven regel toegevoegd, heb het idee dat het daar iets mee te maken heeft ja. Als ik het open en naar het einde van het bestand ga, kom ik uit onder de tekstregels, aan het begin van een nieuwe regel.
Dan is het logisch dat jouw labels leegblijven :) Die labels bevatten namelijk alleen de inhoud van de laatste regel (die wordt immers als laatste ingelezen in de DO-loop).
quote:
Is er een manier om dat tijdens het wegschrijven al te voorkomen, of moet je iets doen waardoor je na de laatste regel de nieuwe lege regel weer delete o.i.d.? Die enter moet natuurlijk wel gebruikt worden om telkens regels onder elkaar in het textbestand te kunnen krijgen...?
Tijdens het wegschrijven (ik neem aan dat dat met een DO of FOR-loop gaat) zou je kunnen kijken of je met de laatste regel bezig bent en als dat het geval is, voeg je geen witregel toe.

Andersom kan ook: Steeds éérst een vbNewLine toevoegen en dan pas de gewenste regel. Met een uitzondering bij de allereerste regel.
  dinsdag 2 augustus 2011 @ 09:54:23 #169
44920 TallMan
Permanent brain failure
pi_100224466
Of bij het uitlezen van het bestand kijken of je een lege regel hebt uitgelezen en die niet processen
geheelonthouder met geheugenverlies
Mensen die zeggen dat domme vragen niet bestaan stellen ze zelf.
pi_100224722
quote:
3s.gif Op dinsdag 2 augustus 2011 09:54 schreef TallMan het volgende:
Of bij het uitlezen van het bestand kijken of je een lege regel hebt uitgelezen en die niet processen
Dat zal denk ik de makkelijkste optie zijn, zal vanavond eens kijken thuis. Thanks.
pi_100288886
Ha ik geloof dat ik het zowaar werkend heb. Dus elke regel uit het textbestand uitlezen en de bijbehorende regel in de Listbox vervangen. Thanks voor de hulp. ^O^.

Nu alleen nog even iets scharrelen zodat de totaalprijs op de juiste manier opnieuw wordt uitgerekend, maar daar kom ik wel uit.
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')