 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 22.07.2013, 10:18 Titel: UDT() an Function |
|
|
Hallo Leute,
ich habe etwas an einem Eingabefeld gebastelt - war ganz ok jetzt wollte ich es überarbeiten so das auf dem Screen mehrere Felder angezeigt werden usw.
Jetzt wollte ich wissn ob man ein komplettes UDT(array) an eine Function übergeben kann und genauso auch zurückgeben.
Mit meinen Versuchen bin ich bis hier gekommen - ohne Func.aufruf gab es keine Meldungen mehr.
Code: | Type textfeld
X as integer
Y as integer
text as string = ""
stringlaenge as integer = 10000
Laenge as integer = 200
betreff as string = ""
End Type
Dim TF(2) AS textfeld
Declare Function FillField(code() as textfeld) as textfeld
Function FillField(code() as textfeld) as textfeld
Dim AS String WF_input
Dim AS integer anzeigbar(UBound(code)), Cursor, n = 0
anzeigbar(0) = code(0).Laenge / 8
anzeigbar(1) = code(1).Laenge / 8
anzeigbar(2) = code(2).Laenge / 8
Do ' Dateiname
Sleep 1
ScreenLock
'Draw String (12, 12), "Pfad und Dateiangabe:", &h505050
Line (code(n).X, code(n).Y)-Step(code(n).Laenge, 12), &hffffff, BF
If LEN(code(n).text) > anzeigbar(n) Then
Draw String (code(n).X+2, code(n).Y+2), _
Mid(code(n).text, (Len(code(n).text)-anzeigbar(n))+1, anzeigbar(n)), &h000000
ElseIF LEN(code(n).text) = 0 Then
Draw String (code(n).X+2, code(n).Y+2), code(n).betreff, &hcccccc
Line ((code(n).X+1)+(Cursor*8), code(n).Y+1) - Step (0, 10), &h100000
Else
Draw String (code(n).X+2, code(n).Y+2), code(n).text, &h000000
Line ((code(n).X+1)+(Cursor*8), code(n).Y+1) - Step (0, 10), &h100000
End If
ScreenUnlock
WF_input = Inkey
IF LEN(WF_Input) = 1 Then
If WF_input = CHR(13) Then Exit Do
'If WF_input = CHR(27) Then Exit Do
If WF_Input = Chr(8) Then
IF Cursor > 0 Then
code(n).text = AddTxt(WF_input, code(n).StringLaenge, code(n).text, Cursor)
Cursor -= 1
End If
Else
IF code(n).text < AddTxt(WF_input, code(n).StringLaenge, code(n).text, Cursor) Then
code(n).text = AddTxt(WF_input, code(n).StringLaenge, code(n).text, Cursor)
Cursor += 1
End If
End If
Else
Select Case WF_Input
Case Chr(255) & Chr(75)
IF Cursor > 0 Then Cursor -= 1
Case Chr(255) & Chr(77)
IF Cursor < Len(code(n).text) Then Cursor += 1
Case Chr(255) & Chr(72)
IF n > LBound(Code) Then n -= 1
Case Chr(255) & Chr(80)
IF n < UBound(code) Then n += 1
End Select
End If
Loop
Return code()
End Function
TF(0).X = 10: TF(0).Y = 10: TF(0).stringlaenge = 5: TF(0).betreff = "tag"
TF(1).X = 10: TF(1).Y = 30: TF(1).stringlaenge = 6: TF(1).betreff = "monat"
TF(2).X = 10: TF(2).Y = 50: TF(2).stringlaenge = 7: TF(2).betreff = "jahr"
FillField()
|
|
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 22.07.2013, 11:26 Titel: |
|
|
Übergeben schon, nur es gibt keine Array-Rückgabe, d. h. 'Return code()' funktioniert nicht. Ein Array-Parameter ist standardmäßig ByRef, du kannst also nach dem Aufruf der Funktion dasselbe Array prüfen, die Werte müssten geändert sein, weil deine Funktion es manipuliert.
Zu dem Thema steht übrigens einiges in der Referenz im Portal. Such mal nach 'Arrays' und 'Parameterübergabe'. |
|
Nach oben |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 23.07.2013, 17:34 Titel: |
|
|
Ich habs mir angesehen. Also wenn ich schreibe byref Code() as textfelddann kann ich mir ein return sparen da die Funktion die original variable verändert.. Im Prinzip muss es also keine Funktion sondern brauch nur eine Sub zu sein. Bzw könnte ich die Funktion etwas anderes zurück geben lassen wie zb ob das was gemacht werden sollte geklappt hat oder nicht.
Hab ich das so richtig verstanden? Sitz gerade nicht an meinem PC. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 23.07.2013, 17:50 Titel: |
|
|
Code: | byref Code() as textfeld |
da kannst du dir das BYREF sparen (geht vielleicht sogar gar nicht?)
Arrays werden ausschließlich BYREF übergeben; eine Übergabe BYVAL ist gar nicht möglich.
Zitat: | Bzw könnte ich die Funktion etwas anderes zurück geben lassen wie zb ob das was gemacht werden sollte geklappt hat oder nicht. |
Das ist prinzipiell eine gute Idee und wird auch häufig so gemacht.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 23.07.2013, 19:47 Titel: |
|
|
Array's sind standardmässig ByRef. Die Angabe ist sogar garnicht erlaubt. übergabe angaben des Arrays im Typeheader der sub/funktion sind nicht erlaubt. Also kein ByRef oder ByVal .. das array ist immer ByRef.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|