myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   VB.NET - Funktion richtig erstellen (https://mygully.com/showthread.php?t=2155149)

.ShoXx! 04.11.10 18:30

VB.NET - Funktion richtig erstellen
 
Hallo, ich habe da ein Problem bei einer Funktion und hoffe mir kann da jemand helfen. Mein Code:
Code:

Dim variable As String
Dim index As Integer
WithEvents tmrWrite As New Timer With {.Interval = 40}

Private Function Write(ByVal text1 As String, ByVal text2 As String)
        Label1.Text = Nothing
        variable = text1 & vbNewLine & text2
        index = 0

        AddHandler tmrWrite.Tick, AddressOf tmrWrite_Tick
        tmrWriteLevel_Tick()
End Function

Sub tmrWrite_Tick()
If tmrWrite.Interval = 40 Then
        If Not Label1.Text = variable.Split(vbnewline)(0) Then
                Label1.Text &= variable.Split(vbNewLine)(0)(index)
                index += 1
        Else
                tmrWrite.Interval = 1000
                index = 0
        End If
ElseIf tmrWrite.Interval = 1000 Then
        tmrWrite.Interval = 41
ElseIf tmrWrite.Interval = 41 Then
                Label1.Text &= variable.Split(vbNewLine)(1)(index)
End If
End Sub

So, nun rufe ich meine Funktion auf, z.B. durch einen Buttonklick:
Code:

'Button_Click
Write("MeinText1", "MeinText2")

Damit will ich es hinbekommen, dass der Text wie eine Art Schreibmaschine geschrieben wird, also jeder Buchstabe einzeln. Erstmal wird der erste Abschnitt mit dem Intervall = 40 geschrieben (also bis vbNewLine), dann wartet er 1sec und schreibt dann mit einem Interval von 41 den 2. Abschnitt, jedoch wird nur der 1. Buchstabe geschrieben und danach nichts mehr..Allerdings klappt es wenn ich normal einen Timer nehme und den Code einfüge, aber ich würde gerne eine Funktion erstellen, damit ich nicht jedes mal so einen langen Code eingeben muss..

urga 04.11.10 19:01

boah, wie ich die syntax von VB hasse ;)
wenn du c# lesen kannst, dann erstelle ich dir ein beispiel in c#.net

.ShoXx! 04.11.10 19:10

xD Geschmackssache^^
Ja das wäre sehr nett, C# kann ich eigentlich auch und falls ich doch etwas nicht verstehe, gibts ja immer noch die Converter.

Hariboo83 04.11.10 20:41

hmmm warum deklarierst Du es als Private Function? Deine Funktion gibt keinen Wert zurück! Du müsstest eigentlich eine Warnung bekommen. In deinem Fall so wie es jetzt ist reicht es als Private Sub!

Hier mal ein Bsp. zur Funktion
Deklaration:

Private Function Rechnen(ByVal x as Integer, ByVal y as Integer) as Integer
Return x + y
End Function

Aufruf:

Ergebnis = Rechnen(2, 9)

In der Variablen Ergebnis steht der Rückgabewert der Funktion Rechnen also 2 + 9 = 11

Also Funtionen werden nur verwendet wenn man Werte der Funktion übergibt und einen Wert mit Return zurückgibt.
Braucht man eine Sub der man nur Werte übergibt oder die nur etwas ausführt aber nichts zurück gibt dann verwendet man Private Sub, Public Sub oder nur Sub

Sub Label_löschen()
label1.text = ""
End Sub

Sub Label_Füllen(ByVal ÜbergebenerText as String)
label1.Text = ÜbergebenerText
End Sub

Falsch:
Private Function Label_Füllen(ByVal ÜbergebenerText as String)
label1.Text = ÜbergebenerText
End Sub

Richtig:
Private Function Label_Füllen(ByVal ÜbergebenerText as String) as String
Return ÜbergebenerText
End Sub

Das mal so als Info. Bei deinem Problem kann ich dir leider nicht helfen aber schaue doch mal hier [Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...] ist echt super Forum für so sachen.

KeinGeld 04.11.10 20:44

bei mir kommt auch nur ein M immer...

urga 05.11.10 18:25

das form hat 3 elemente: textBox1, label1, timer1.
gesteuert werden die zeiten über

tickerCharMS: ms für die einzelnden buchstaben
tickerNewLineMS: ms die für eine newline gewartet werden.

tickerCharMS soll sich ja pro zeile um 1 erhöhen.
um einen effekt zu bemerken habe ich den um jeweils 50 erhöht.

Code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace laufschrift {
        public partial class Form1 : Form {
                public Form1 () {
                        InitializeComponent ();
                        this.timer1.Enabled = false;
                }

                private String[] tickerText;
                private int tickerTextIndex;
                private int tickerCharIndex;
                private int tickerCharMS;
                private int tickerNewLineMS;

                private void initTimer () {
                        this.tickerText = this.textBox1.Text.Trim ().Split (new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
                        this.tickerTextIndex = 0;
                        this.tickerCharIndex = 0;
                        this.label1.Text = "";
                        this.tickerCharMS = 41;
                        this.tickerNewLineMS = 1000;
                        this.timer1.Interval = this.tickerCharMS;
                        this.timer1.Enabled = true;
                }

                private void button1_Click (object sender, EventArgs e) {
                        this.label1.Text = "";
                        if (this.textBox1.Text.Trim ().Length > 0) {
                                this.initTimer ();
                                this.button1.Enabled = false;
                        }
                }

                private bool wasNewLine = false;
                private void timer1_Tick (object sender, EventArgs e) {
                        if (this.wasNewLine) {
                                this.timer1.Interval = this.tickerCharMS + this.tickerTextIndex*50;
                                this.wasNewLine = false;
                        }

                        string s = this.tickerText[this.tickerTextIndex];
                        char c = s.ElementAt (this.tickerCharIndex);
                        this.label1.Text += c;
                        if (this.tickerCharIndex + 1 < s.Length) {
                                this.tickerCharIndex++;
                        }
                        else {
                                this.tickerCharIndex = 0;
                                if (this.tickerTextIndex + 1 < this.tickerText.Length) {
                                        this.label1.Text += "\r\n";
                                        this.tickerTextIndex++;
                                        this.timer1.Interval = this.tickerNewLineMS;
                                        this.wasNewLine = true;
                                }
                                else {
                                        this.timer1.Enabled = false;
                                        this.button1.Enabled = true;
                                }
                        }
                }
        }
}


urga 06.11.10 18:58

sinnvoll wäre allerdings eine eigene Tickerklasse.
Code:

public class Ticker extends Label {
 public Ticker (String[] messages, int chardelay, int linedelay) {
 }
}



Alle Zeitangaben in WEZ +1. Es ist jetzt 17:30 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.