Funktion letzte Zeile

Die Funktion selbst arbeitet damit, dass man beim binären Lesen bestimmen kann, welches Zeichen man auslesen will, es wird da halt von hinten gelesen, bis man die Zeile hat. Beispiel funktioniert bei mir ohne Probleme.

Hab die Funktion (Aufruf erfolgt gleich wie bisher) ein klein wenig für dich umgeschrieben, jetzt arbeitet es so, dass die gesamte Datei eingelesen wird und dann in Zeilen aufgeteilt wird. Beispiel funktioniert ihne Probleme:
Visual Basic:
Public Function ReadLastLine(sFileName As String, _
  ByVal bTrimNullString As Boolean, _
  Optional ByVal XteLastLine As Long = 0) As String

  On Error Resume Next
  Dim F As Integer
  Dim sAlleZeilen() As String
  Dim sDateiinhalt As String
  
  ' Datei öffnen
  F = FreeFile
  Open sFileName For Binary Access Read As #F
  
   ' Dateigröße
   sDateiinhalt = Space(LOF(F))
  
   ' Ganze Datei einlesen
   Get #F, , sDateiinhalt
   
  ' Datei schließen
  Close #F
  
  ' Am Zeilenumbruch trennen
  sAlleZeilen = Split(sDateiinhalt, vbNewLine)
   
  ' Leere Zeilen am Ende entfernen
  If bTrimNullString Then
   Do
    If Trim(sAlleZeilen(UBound(sAlleZeilen))) <> "" Then Exit Do
    ReDim Preserve sAlleZeilen(UBound(sAlleZeilen) - 1)
   Loop
  End If
   
  ' Gewählte Zeile zurückgeben
  ReadLastLine = sAlleZeilen(UBound(sAlleZeilen) - XteLastLine)
End Function


Der Doc!
 
hi DrSoong !
Erstmal Danke für Deine Mühe, die Du Dir gemacht hast, die Funktion zu ändern. Aber auch damit geht es bei mir nicht. Deshalb sage ich einfach mal was ich machen will. Übrigens mein Funktionsaufruf lautete:

Text14.Text = ReadLastLine(Text1.Text, True, Val(-1))

Wobei in Text1.Text auf meiner Form Text einer Fremdanwendung eintrifft, der sich ständig ändert. Da ich nur jeweils die letzte aktuelle Zeile benötige um sie weiter zu verarbeiten, muß ich sie ausschneiden und in Text14.Text kopieren. Daran sitze ich schon 14 Tage und bin in Begriff das Projekt auf Eis zulegen bis ich eine andere Möglichkeit gefunden habe, eventuell nur die aktuelle Zeile zu importieren.
 
Ich denke, der Fehler liegt darin, dass du eine negative Zahl als Argument beim Aufruf übergibst, in der Projektbeschreibung steht ja
0 bedeutet hierbei die letzte Zeile, 1 die vorletzte Zeile, 2 die drittletzte Zeile usw
Probiers mal mit einer positiven Zahl (bzw. 0, wenn du die letzte Zeile willst):
Visual Basic:
Text14.Text = ReadLastLine(Text1.Text, True, 0)


Der Doc!
 
Hi Doc !
Das habe ich auch schon ausprobiert geht leider nicht. Habe auch eine andere Funktion ausprobiert, die geht ebenfalls nicht.

Public Function txt_ReadLine(ByVal sFileName As String, _
ByVal LineToRead As Long) As String

Dim F As Integer
Dim sLine As String
Dim lRow As Long

lRow = 0
' Existiert die Datei ?
If Dir$(sFileName) <> "" Then

' Datei zum Lesen öffnen
F = FreeFile
Open sFileName For Input As #F

' Solange einlesen, bis entweder Dateiende
' oder gewünschte Zeilennummer erreicht
While Not EOF(F) And lRow < LineToRead
lRow = lRow + 1
Line Input #F, sLine
Wend
Close #F
End If

' Dateiende wurde frühzeitig erreicht,
' oder Datei war nicht vorhanden
If lRow < LineToRead Then _
sLine = ""

txt_ReadLine = sLine
End Function

Meine Aufruf-Zeile:

Text14.Text = txt_ReadLine("Text1.Text", 0)

Habe auch versucht hinten statt 0 verschiedene Zahlen zu schreiben leider kein Erfolg.
Kann es sein das eine Funktion erst geht wenn man eine EXE draus gemacht hat?.
 
Ist eigentlich egal, bei mir funktioniert es auch in der IDE.

Was mir bei dir auffällt ist die Zeile
Visual Basic:
Text14.Text = txt_ReadLine("Text1.Text", 0)
da ist das Text1.Text in Anführungszeichen. Die gehören weg, die Datei heisst ja nicht "Text1.Text" sondern der Name soll aus der Textbox geholt werden.

Ich fass beide Funktionen heute abend in einer VB-App zusammen und stell sie gezippt hier für dich hoch (nur Quelltext, keine EXE, ein ZIP-File). Ich werds auch so austesten, dass es bei mir 100% funktioniert, vielleicht findest du dann deinen Fehler.


Der Doc!
 
Hi Doc !
Ich habe die Anführungszeichen entfernt, jetzt kommt eine Fehler-Meldung in der Funktion " txt_ReadLine ", inder Zeile: " If Dir$(sFileName) <> "" Then ", gelb unterlegt mit dem Hinweis " Datei oder Datei-Nr. falsch ". Aber wen ich mit dem Mauszeiger drauf gehe wird der Text von Text1.Text angezeigt. ? Ich sehe einfach nicht durch ! .
 
He Doc !
Mache Dir mal weiter keine Arbeit, ich glaube ich habe es. Bin ganz nahe dran. Ich melde mich wieder.
 
Hi Doc !
Mit Hilfe deiner Funktion, die Du am Anfang gepostet hast ist es mir gelungen das Problem zu lösen. Hier das Ergebnis was Funktioniert:

Private Sub Timer9_Timer() 'hier wird das Chattextfenster ausgelesen

Dim hwnd As String
Dim lLength As Long
Dim sWindowText As String * 10024
hwnd = Text3.Text 'Handle des Chattextfensters

Text1.Text = "" 'Textinhalt vorher leeren
'Message wird geschickt an das Handle von Text3 zum auslesen
lLength = SendMessage(hwnd, WM_GETTEXT, _
Len(sWindowText) + 1, ByVal sWindowText)
'Ausgelesener Text landet in Text1
Text1.Text = Left(sWindowText, lLength)
Text1.SelStart = lLength 'Text wird gescrollt
lLength = Len(Text1.Text)

'''''''''''''''''''''''''''''''''''''''''''''''''''''
'Letzte Zeile auslesen

Dim sAlleZeilen() As String
Dim sDateiinhalt As String
Dim bTrimNullString As Boolean

sDateiinhalt = Text1.Text

sAlleZeilen = Split(sDateiinhalt, vbNewLine)
' Leere Zeilen am Ende entfernen
If bTrimNullString Then
Do 'Letzte Zeile ermitteln
If Trim(sAlleZeilen(UBound(sAlleZeilen))) <> "" Then Exit Do
ReDim Preserve sAlleZeilen(UBound(sAlleZeilen) - 1)
Loop
End If
'in Text14 wird die letzte Zeile angezeigt
Text14.Text = sAlleZeilen(UBound(sAlleZeilen) - 1)
''''''''''''''''''''''''''''''''''''''''''''''''''''''
Timer11.Enabled = True 'Timer-Start zur Weiterverarbeitung

End Sub

Das was zwischen den gestrichelten Linien steht hat mir mehr als 14 Tage aufgehalten. Deshalb danke ich Dir für Deine Unterstützung. So jetzt kann es weitergehen es müssen noch die Vorangestellten Namen, Uhrzeiten oder Sonderzeichen aus der Letzten Zeile vor der Übergabe an den Chatbot entfernt werden, u.s.w. es soll mal ein Chatbeantworter werden. mfg Amo8
 
Zurück