Efter att jag har skapat en liten textfil vill jag öppna denna direkt med notepad. Det är inga problem att öppna notepad, men jag får inte till det med att hämta värdet från en textbox. Se exempel. Hej För att leva upp till min nya titel "TjaffsNissen", måste jag anmärka att man inte ska omge parametrar till subrutin anropet. Om man inte använder sig av Call. Hej Som Andreas skrev, man skall inte omge parametrar i funktioner med paranteser om man inte tilldelar en variabel svaret eller skriver call framför. Hej Det är olyckligt att det är så. Hej Det är information som jag ackumelerat. Vet inte varifrån den kommer. Men stämmer gör den ju. Det är ju bara att testa, använda logik och dra korrekt slutsattser... Men förh...e lägg av. Bete er som vuxna människor här i forumet. Jag är förvånad att du som är påläst inte förstår vad som händer... OK Andreas jag ger mig, du har rätt.Notepad
Call Shell("notepad.exe [här vill jag hämta filnamnet från en textbox]", 1)
någon som vet?
/haniSv: Notepad
Ett exempel som jag har användt, Anteckningar.txt
ligger i samma mapp som min exefil
ret = Shell("NotePad.exe " & Text1.Text, vbNormalFocus)
Private Sub mnuNotePad_Click()
Dim ret As Long
On Error GoTo NotepadError
ret = Shell("NotePad.exe " & _
App.Path & "\Anteckningar.txt", vbNormalFocus)
Exit Sub
NotepadError:
MsgBox ("Kunde inte hitta fil NotePad.exe")
End Sub
mvh
SvenSv: Notepad
Vad parantesen gör i deta fallet är att utvärdera vilkoret. Vilket ger fel om man anger mer en ett argument. T.Ex
MsgBox (Err.Description,vbCritical )
Detta beror på att VB inte kan utvärdera uttrycket (Err.Description,vbCritical ) och retunera det som första argumentet. Därför bör man skriva:
MsgBox Err.Description, vbCritical
Om man dock vill använda sig av paranteser får ange Call framför.
Call MsgBox (Err.Description, vbCritical)
Man kan omge parametrarna med paranteser:
MsgBox (Err.Description), (vbCritical)
Fast detta är ju onödigt, men jag tar med det här exemplet för visar vad det är man egentligen gör när man omger första parametern inom paranteser.
Det kan ochså ställa till med problem ifall parametern är ett objekt med en default egenskap. T.Ex.
Private Sub Command1_Click()
ClearTextBox (Text1)
End Sub
Private Sub Command2_Click()
ClearTextBox Text1
End Sub
Private Sub ClearTextBox(TextBox As TextBox)
TextBox.Text = ""
End Sub
Koden i Command1 kommer ge felmeddelandet Type missmatch. Deta för att vb har utvärderat Text1 och retunerat Text egenskapen vilket är defaultegenskapen för text objekte. Eftersom detta är en sträng och subrutinen förväntar sig ett objekt ger det ett fel.
Som tur är har Microsoft bestämt sig för att korrigera detta i VB.NET där man alltid anger parametrar inom paranteser...Sv: Notepad
>Är det något fel att Andreas rättar felaktig kod?
Då måste jag stillsamt fråga vad är det som är
fel i den kod jag visar på.
mvh
SvenSv: Notepad
Kanske passar bra med ett citat här: "Det går ju att göra så, men det är inte rätt"
/IvarSv: Notepad
Förmodar att Ni syftar på MsgBox
Då kommer nästa fråga gäller inte denna Syntax
Function Syntax
MsgBox(msg[,[type][,title]])
*****************************
Statement Syntax
MsgBox msg[,[type][,title]]
mvh
SvenSv: Notepad
Korrekt syntax om du inte tar emot retunerat värde eller använder dig av call är utan paranteser oavsett om det är en funktion eller subrutin...
Ja det går faktist att anropa en funktion utan att ta emot värdet eller använda sig av Call...
Ex.
Private Sub Form_Load()
Test "Ett", "Två", "Tre"
End Sub
Function Test(Value1 As Variant, Value2 As Variant, Value3 As Variant) As Variant
MsgBox Value1
MsgBox Value2
MsgBox Value3
End FunctionSv: Notepad
Du slingrar dig som en metmask på kroken.
Antinge gäller syntaxen eller så gäller den inte .
Förresten vilka källor referear du till med dina påstående.
DSSv: Notepad
Sv: Notepad
Felets är Microsofts och ingen annans. Om ett språk tillåter en att
programmera enligt en viss stil är detta inte fel. Bara mer eller mindre
bra.
Jag lägger mig i denna diskussion eftersom det verkar som så att jag
är en av dom få som är utbildad inom datavetenskap som yttrar sig
i forumet. (Inte för att jag menar att ni andra inget kan, ni självlärda
men jag kanske har en annan vinkling som ni inte har) So please here
me out.
I ett programmeringsspråk finns egentligen bara funktioner. Subrutiner
är bara ett namn på en funktion som saknar returvärde.
Nu är det dock inte så enkelt.
Microsoft har verkligen lyckats röra till det. En funktion skall utan
undantag alltid skicka ett returvärde.
y = f(x); är en funktion som returnerar ett resultat beroende på inparametern x
I VB kan man dock TYVÄRR skita i returvärdet och det är där som det
egentliga problemet ligger.
Man borde enligt min mening inte kunna skriva så här:
Private Function F(X as integer)
'Kod
End Sub
Detta borde generera ett fel. Men så är det inte i VB.
i C åtgärdas detta automatiskt då subrutiner inte existerar utan att man
där måste deklararea sina subrutiner som en funktion utan returvärde
void F(int X) {
/* Kod */
}
Där uppstår alldrig problemet.
I VB kan du göra följande utan att du får fel
Sample Code ===============================
Option Explicit
Private Sub Command1_Click()
Dim a As Integer
a = testar(2) '(1)
testar 2 '(2)
testar (2) '(3)
End Sub
Private Function testar(i As Integer) As Integer
testar = i + 20
End Function
Sample Code ===============================
(1) -- Detta är det mest korrekta sättet att anropa en funktion.
(2) -- Med detta sätt skall man istället deklarera en subrutin "Sub"
(3) -- Detta är ett mellanting. Du anropar som om det vore en funktion
och en subrutin på samma gång. Det är här som Microsoft inte
lyckats.
Så sluta gnabba. Om VB tillåter något är det inte fel. Däremot kan jag
hålla med om att det är bättre att inte använda parenteser runt sub-
rutinanrop.Sv: Notepad
Option Explicit
Private Sub Command1_Click()
Dim a As Integer
a = testar(2) '(1)
testar 2 '(2)
testar (2) '(3)
End Sub
Private Function testar(i As Integer) As Integer
testar = i + 20
End Function
I ditt exempel skiljer sig inte exempel 2 och 3 i anropet.
Parantesen har samma funktion som den har i en matematisk uttryck. t.ex
Dim I as Integer
I = 1 * (2 + 3)
Den får uttrycket att utvärderas.
Låtås bevisa detta ytterligare genom att lägga till en parameter:
Private Sub Command1_Click()
Dim a As Integer
a = testar(2, 20) '(1)
testar 2, 20 '(2)
testar (2, 20) '(3)
End Sub
Private Function testar(Value1 As Integer, Value2 As Integer) As Integer
testar = Value1 + Value2
End Function
Nu ger exempel 3 syntax fel. Vist är det underligt?
Nej egentligen är det uppenbar...
Låt oss utvärdera vilkoret i sin egen sats.
Dim I as Integer
I = 1 * (2, 3)
Om vi ser på det här exemplet så är det ju uppenbart att det strider mot syntax i Vb.
Slutsats:
Syntax som bör användas är 3 st och det är följande:
Private Sub Command1_Click()
Dim a As Integer
a = testar(2, 20) '(1)
testar 2, 20 '(2)
Call testar(2, 20) '(4)
End Sub
Private Function testar(Value1 As Integer, Value2 As Integer) As Integer
testar = Value1 + Value2
End Function
Om det nu inte finns någon somm håller med mig ber jag dig nogrant studera tidigare inläg. Testa dessa inlägg i VB. Du kommer nog finna att det stämmer...
/Mvh, Andreas HillqvistSv: Notepad
Jag orkar inte argumentera.
Var nog inne på lite för mycket C tor jag.
/peterh