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
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.431 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
44.340 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
Ein Therapeut entspricht 1024 Gigapeut.

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.431 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
Antwort Antwort


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 00:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz