Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Memo befüllen in Timer = leer (https://www.delphipraxis.net/192203-memo-befuellen-timer-%3D-leer.html)

Mohadrim 28. Mär 2017 14:26

Delphi-Version: 10 Berlin

Memo befüllen in Timer = leer
 
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.

haentschman 28. Mär 2017 14:34

AW: Memo befüllen in Timer = leer
 
Moin...:P

Wo setzt du den Timer auf True? Im OI oder über Code? Was hat
Delphi-Quellcode:
if time = 0 then
für einen Sinn? Wie sieht die Variable Time aus? :gruebel:
...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. :gruebel:

himitsu 28. Mär 2017 14:36

AW: Memo befüllen in Timer = leer
 
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

Mohadrim 28. Mär 2017 14:42

AW: Memo befüllen in Timer = leer
 
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.

haentschman 28. Mär 2017 14:46

AW: Memo befüllen in Timer = leer
 
Moin...:P
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. :gruebel:

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...:wink:
PS2: Einen Couter würde ich statt den falschem time in CurrentStep (oder so) umbenennen. :wink:

nahpets 28. Mär 2017 15:02

AW: Memo befüllen in Timer = leer
 
Mal im Debugger gefragt, ob diese Bedingung überhaupt erfüllt ist?
Delphi-Quellcode:
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;

a.def 28. Mär 2017 16:19

AW: Memo befüllen in Timer = leer
 
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]);

Bernhard Geyer 28. Mär 2017 16:40

AW: Memo befüllen in Timer = leer
 
Delphi-Quellcode:
 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.

p80286 28. Mär 2017 17:43

AW: Memo befüllen in Timer = leer
 
Und wie/wo ist r vorbelegt worden?
wenn
Delphi-Quellcode:
r=4
dann kannst Du das alles in die Tonne kloppen!

Gruß
K-H

himitsu 29. Mär 2017 00:21

AW: Memo befüllen in Timer = leer
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:42 Uhr.
Seite 1 von 2  1 2      

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