AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Memo befüllen in Timer = leer

Ein Thema von Mohadrim · begonnen am 28. Mär 2017 · letzter Beitrag vom 29. Mär 2017
Antwort Antwort
Seite 1 von 2  1 2      
Mohadrim

Registriert seit: 4. Jun 2004
8 Beiträge
 
#1

Memo befüllen in Timer = leer

  Alt 28. Mär 2017, 14:26
Delphi-Version: 10 Berlin
Hallo,

ich habe hier ein ganz komisches Problem.

Es existieren zwei Memo Boxen. Memo1 liest eine Datei ein und schaut Zeile für Zeile ob ein String vorhanden ist, wenn ja wird ab dieser Zeile nichts mehr in Memo2 eingetragen. Das funktioniert super in Form.Show aber nicht wenn dies in einem Timer aufgerufen wird. Das Memo ist nur 20-40Zeilen lang (Config Datei)
Ich möchte mit Ablauf von Timer2 in der Config ab der Zeile mit String #Hier_nicht_mehr die restlichen Zeilen raus haben.

Delphi-Quellcode:
  Memo1.Lines.LoadFromFile('dateiname');
  Memo2.Clear;
  for i := 0 to Memo1.Lines.Count-1 do begin
    if (Pos('#Hier_nicht_mehr', Memo1.Lines[i]) <> 0) and (r = 0) then
      r := 1;
    if r = 0 then
      Memo2.Lines.Add(Memo1.Lines[i]);
  end;
In dem Timer siehts dann so aus

Delphi-Quellcode:
  if time = 0 then
  begin
    Timer1.Enable := false;
    Memo1.Lines.LoadFromFile('dateiname');
    Memo2.Clear;
    for i := 0 to Memo1.Lines.Count-1 do begin
      if (Pos('#Hier_nicht_mehr', Memo1.Lines[i]) <> 0) and (r = 0) then
        r := 1;
      if r = 0 then
        Memo2.Lines.Add(Memo1.Lines[i]);
    end;
  end;
In der if Abfrage wird vor und nach der For Schleife noch zwei andere Sachen gesetzt die auch richtig sind. Hab schon die Memo Sachen in eine eigene procedur ausgelager und die dort aufgerufen aber das geht auch nicht. Im Form.Show hingegen alles super. Es mit nur einem Memo zu versuchen brachte auch nichts.

Delphi-Quellcode:
  for i := 0 to Memo1.Lines.Count-1 do begin
    if (Pos('#Hier_nicht_mehr', Memo1.Lines[i]) > 0) and (r = 0) then
      r := 1;
    if r = 1 then
      Memo1.Lines.Delete(i);
  end;

Die Config sieht so aus:

Code:
# Infotext
# Infotext
# Infotext

stream = 1
bitrate = 128

#Hier_nicht_mehr
typ = mp3
...
Wäre super wenn jemand die Lösung kennt.

Geändert von Mohadrim (28. Mär 2017 um 14:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.297 Beiträge
 
Delphi 12 Athens
 
#2

AW: Memo befüllen in Timer = leer

  Alt 28. Mär 2017, 14:34
Moin...

Wo setzt du den Timer auf True? Im OI oder über Code? Was hat if time = 0 then für einen Sinn? Wie sieht die Variable Time aus?
...im Prinzip sieht es danach aus, das du die Funktion des Timers nicht verstanden hast oder den Timer mißbrauchst. Ich habe das Gefühl, das zu einer fetsgelegten Zeit etwas ausführen möchtest.

Geändert von haentschman (28. Mär 2017 um 14:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#3

AW: Memo befüllen in Timer = leer

  Alt 28. Mär 2017, 14:36
Der Timer ist aktiv?

[Edit] Time ist nicht zufällig das Time aus der SysUtils?
Wenn doch, dann schäm dich, für einen "genauen" Vergleich mit einem Float
und dem extrem unwahrscheinlichen Fall, dass diese Zeile genau auf die Millisekunde um Mitternacht ausgeführt wird.

Wo wird r initialisiert?

Warum die Variable r und nicht einfach Delphi-Referenz durchsuchenBreak?



Pos<>0 ... ContainsText bzw. ContainsStr oder StartsText bzw. StartsStr > Delphi-Referenz durchsuchenStrUtils
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (28. Mär 2017 um 14:41 Uhr)
  Mit Zitat antworten Zitat
Mohadrim

Registriert seit: 4. Jun 2004
8 Beiträge
 
#4

AW: Memo befüllen in Timer = leer

  Alt 28. Mär 2017, 14:42
Der Timer Timer1 ist über einen Button aktivert worden das geht ja alles wie gesagt auch das, was noch nach der For Schleife kommt wird umgesetzt genauso wie das davor.

time ist einer Zähler der beim Button klick auf 10 gesetzt wird und mit jedem Timer1 Event um 1 runtergezählt wird. r ist ein Integer und dient mir als Schranke damit das Programm weiß ok r = 1 also Zeile nicht mehr hinzufügen. Das Funktioniert auch super Problem ist eben nur, dass es in der procedur TForm1.Timer1Timer nicht mehr geht. Bei FormShow oder direkt bei Button1.Click funktioniert der Code auch.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.297 Beiträge
 
Delphi 12 Athens
 
#5

AW: Memo befüllen in Timer = leer

  Alt 28. Mär 2017, 14:46
Moin...
Zitat:
time ist einer Zähler der beim Button klick auf 10 gesetzt wird und mit jedem Timer1 Event um 1 runtergezählt wird
...das sehe ich im Code nicht.

PS: time ist eine denkbar ungünstige Benamsung der Variable... Siehe himitsu: http://docwiki.embarcadero.com/Libra....SysUtils.Time
PS1: Das kommt von der nicht Benutzung von sprechenden Variablen wie time oder r. Die Kollidierung mit Systemvariablen kann dann nicht passieren...
PS2: Einen Couter würde ich statt den falschem time in CurrentStep (oder so) umbenennen.

Geändert von haentschman (28. Mär 2017 um 15:04 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: Memo befüllen in Timer = leer

  Alt 28. Mär 2017, 15:02
Mal im Debugger gefragt, ob diese Bedingung überhaupt erfüllt ist? if time = 0
Time ist übrigens die akuelle Uhrzeit, es sei denn, es gibt eine globale Variabel gleichen Namens, was aber äußerst ungünstig wäre. Bitte bennne die Variabel Time um, um Fehler durch Namenskonflikte ausschließen zu können.
Delphi-Quellcode:
  Memo1.Clear;
  if time = 0 then
  begin
    Timer1.Enable := false;
    Memo1.Lines.LoadFromFile('dateiname');
    Memo2.Clear;
    for i := 0 to Memo1.Lines.Count-1 do begin
      if (Pos('#Hier_nicht_mehr', Memo1.Lines[i]) <> 0) and (r = 0) then
        r := 1;
      if r = 0 then
        Memo2.Lines.Add(Memo1.Lines[i]);
    end;
  end;
Wenn bei dem von mir geänderten Quelltext das Memo1 immer leer ist, dann ist die Bedingung time = 0 nicht erfüllt.
Der Fehler liegt höchstwahrscheinlich nicht in der For-Schleife, sondern entweder im Timerhandling oder in der Programmlogik des Timerereignisses irgendwo vor Timer1.Enable := false;
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#7

AW: Memo befüllen in Timer = leer

  Alt 28. Mär 2017, 16:19
Delphi-Quellcode:
if (Pos('#Hier_nicht_mehr', Memo1.Lines[i]) <> 0) and (r = 0) then
 r := 1;
if r = 0 then
 Memo2.Lines.Add(Memo1.Lines[i]);
Warum nicht...
Delphi-Quellcode:
if Pos('#Hier_nicht_mehr', Memo1.Lines[i]) > 0 then
 Break // Schleife beenden statt den Quatsch mit r := und if r = zu machen
else
 Lines.Add(Memo1.Lines[i]);
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Memo befüllen in Timer = leer

  Alt 28. Mär 2017, 16:40
 Memo1.Lines.LoadFromFile('dateiname'); Ich hoffe 'dateiname' ist ein vollständiger Dateiname mit Pfad.
Ansonsten ist es zufall ob deine Datei (neben der Exe) genommen wird.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Memo befüllen in Timer = leer

  Alt 28. Mär 2017, 17:43
Und wie/wo ist r vorbelegt worden?
wenn r=4 dann kannst Du das alles in die Tonne kloppen!

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#10

AW: Memo befüllen in Timer = leer

  Alt 29. Mär 2017, 00:21
Also, im Prinzip wurden ja alle Möglichkeiten schon mehrmals genannt
und es gibt nur 3 Problemzonen und eine Aufgabenstellung, die nun endlich mal geklärt werden sollten.
  • Time ist nie 0, dann geht es nie in den Code
  • die Datei ist leer, dann passiert nichts in der Schleife
  • r ist nicht initialisiert, steht zu Beginn auf sonstwas und somit trift niemals das if i=0
  • und du solltes lernen den Debugger zu benutzen, dann würdest du bestimmt sofort den Grund sehen können
    > Haltepunkte auf die 3 eventuellen Problemzeilen und angucken ob in den Variablen auch etwas Richtiges drin steht
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (29. Mär 2017 um 00:23 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz