![]() |
Re: Spaltenweise auf TStringList zugreifen
Dachte ich auch,aber dadurch dass das ja ein TimerEvent ist, wird das doch immer aktualisiert bevor ich das prüfen kann,oder?
|
Re: Spaltenweise auf TStringList zugreifen
Hallo,
du sollst es ja auch im TimeEvent prüfen. Gleich als 1. Code. Hat sich nix geändert Exit Heiko |
Re: Spaltenweise auf TStringList zugreifen
Zitat:
Delphi-Quellcode:
verwendbar gemacht wird. Blick net durch.
Sek.LoadFromFile(DreiSek);
|
Re: Spaltenweise auf TStringList zugreifen
Weiß niemand Rat?
|
Re: Spaltenweise auf TStringList zugreifen
Ja, du lädst die Datei und wenn die Anzahl gleich ist, dann gehst du raus... (finally wird nach Exit übrigens auch ausgeführt)
Alternativ müsstest du die Dateigröße selbst bestimmen, dann bräuchtest du erst gar nix zu laden. |
Re: Spaltenweise auf TStringList zugreifen
So?
Delphi-Quellcode:
var Zeilenanzahl, linenum : integer;
begin try Sek.LoadFromFile(DreiSek); linenum := Sek.Count; if Zeilenanzahl = linenum then exit; Zeilenanzahl := Sek.Count-1; ....... finally ... end; end; |
Re: Spaltenweise auf TStringList zugreifen
Naja, fast...
Du weist linenum (dem neuen Wert) Sek.Count zu, der alte jedoch (Zeilenanzahl) hatte vorher den Wert Sek.Count - 1 bekommen. Fazit: Der Vergleich wird dann wahr, wenn eine Zeile in der Datei gelöscht wurde... ;-) Lösung:
Delphi-Quellcode:
// EDIT:
var Zeilenanzahl, linenum : integer;
begin try Sek.LoadFromFile(DreiSek); if Zeilenanzahl = Sek.Count - 1 then Exit; Zeilenanzahl := Sek.Count - 1; ....... finally ... end; end; Wobei ich schlicht das - 1 dort ganz weglassen würde... // EDIT2: Und Zeilenanzahl muss eben wie gesagt als Feld oder Eigenschaft des Formulars deklariert sein, nicht als lokale Variable (die bei jedem Aufruf wieder verworfen wird)... |
Re: Spaltenweise auf TStringList zugreifen
Mit :
Delphi-Quellcode:
gibt es eine Zuzgriffsverletzung.
type
TMomFiles=class(TForm) private FZeilenanzahl : integer; { Private-Deklarationen } public { Public-Deklarationen } ...... property Zeilenanzahl: Integer Read FZeilenanzahl Write FZeilenanzahl; end; ....... Sek.LoadFromFile(DreiSek); if Zeilenanzahl = Sek.Count -1 then exit; |
Re: Spaltenweise auf TStringList zugreifen
Dann musst du schauen wo.
|
Re: Spaltenweise auf TStringList zugreifen
Wie finde ich denn die Adresse, die in der Zugriffsverletzung geg ist?
|
Re: Spaltenweise auf TStringList zugreifen
Habs hinbekommen. Also er meckert an jeder Stelle, wo Zeilenanzahl aufgerufen wird.
z.b.
Delphi-Quellcode:
if Zeilenanzahl = Sek.Count -1 then exit;
|
Re: Spaltenweise auf TStringList zugreifen
Woran kann das liegen? Hab ich die Property falsch deklariert?oder etwas vergessen
|
Re: Spaltenweise auf TStringList zugreifen
Bitte nicht vor Ablauf von 24 Stunden pushen :warn:
|
Re: Spaltenweise auf TStringList zugreifen
Eine Zugriffsverletzung bekommt man meißtens wenn man etwas nicht erstellt hat:
Das hier geht wunderbar
Delphi-Quellcode:
Während das hier zur einer AV (= Accessviolatuion = Zugriffsverletzung) führt:
Meins := TStringList.Create;
try // Mit "Meins" arbeiten // z.B. eine Zeile hinzufügen Meins.Add('Hallo Welt'); finally Meins.Free; end;
Delphi-Quellcode:
Ich tippe mal darauf (ausgehend von dem Codestück aus dem Post #47), dass Sek nicht erstellt wurde.
try
// Mit "Meins" arbeiten // z.B. eine Zeile hinzufügen Meins.Add('Hallo Welt'); // <!--- Hier knallt es, weil "Meins" nicht erstellt wurde finally Meins.Free; end; Könntest du uns vielleicht mal etwas mehr Code zeigen? Also alles bis zum Exit dürfte erstmal reichen. MfG xZise |
Re: Spaltenweise auf TStringList zugreifen
Ok, also bis zum xis sieht das so aus:
Delphi-Quellcode:
Zeileananzahl habe ich als property deklariert und da wird auch irgendwo der Knackpunkt sein. Sek wurde bereits erstellt. (u.a. in #20 sichtbar)
procedure ZehnMinTimerEvent(Sender: TObject);
var Sek, Min, ZwSpeicher : TStringList; DreiSek, ZehnMin: string; TabPos, Spaltenanzahl, linenum : integer; begin DreiSek := extractfilepath(application.exename)+'Mom3sek_'+Kennung+'.txt'; ZehnMin := extractfilepath(application.exename)+'Mom10min_'+Kennung+'.txt'; TestDatei := TFileStream.Create(ExtractFilePath(application.exename)+'test.txt',fmOpenReadWrite); TestDatei.Seek(0, soFromEnd); Sek := TStringList.Create; Min := TStringList.Create; ZwSpeicher := TStringList.Create; try Sek.LoadFromFile(DreiSek); if Zeilenanzahl = Sek.Count-1 then exit; |
Re: Spaltenweise auf TStringList zugreifen
Zitat:
Das müsste doch eigentlich eine Methode einer Klasse sein, wie sonst kannst du auf die Eigenschaft Zeilenanzahl zugreifen? Und sonst ginge das auch gar nicht als Timer-Ereignis. Das kann so also eigentlich nicht der originale Code sein, wenn sich das kompilieren lässt. :gruebel: |
Re: Spaltenweise auf TStringList zugreifen
Delphi-Quellcode:
ach gott, nee da steht eigentlich
procedure ZehnMinTimerEvent(Sender: TObject);
Delphi-Quellcode:
procedure TMomFiles.ZehnMinTimerEvent(Sender: TObject);
|
Re: Spaltenweise auf TStringList zugreifen
Ich hatte mich nur gefragt, ob du sonst beim Kopieren / Abschreiben noch andere Fehler eingebaut hast... ;-)
Denn der Quelltext sieht soweit funktionierend aus. :gruebel: Da beim Zugriff auf die Property ein Fehler passiert, setze bitte einmal einen Haltepunkt auf diese Zeile, drücke wenn das Programm dort ankommt Strg + F7 und werte Self aus. Vermutung: Das könnte nil sein. Schau da einmal nach, bevor ich da noch viel zu schreibe, wenn es doch nicht so sein sollte. |
Re: Spaltenweise auf TStringList zugreifen
Wenn ich F7 drücke, passiert aber nix.
|
Re: Spaltenweise auf TStringList zugreifen
Strg + F7, nicht nur F7. Dann sollte, wenn das Programm am Haltepunkt angehalten hat, das Fenster zum Auswerten eines Ausdrucks angezeigt werden. Dort kannst du dann Self hineinschreiben um zu schauen was das (also der aktuelle Objektzeiger zu der Methode) für einen Wert hat.
|
Re: Spaltenweise auf TStringList zugreifen
Da steht überall Prozess nicht verfügbar
|
Re: Spaltenweise auf TStringList zugreifen
Vielleicht wäre es ratsam dich ein wenig von deinem konkreten Problem zu lösen und dzu versuchen die Grundlagen, die man dir versucht hier beizubringen zu verstehen.
|
Re: Spaltenweise auf TStringList zugreifen
Also ich habe jetzt mal bei
Delphi-Quellcode:
einen Haltepunkt gesetzt und da ist self nil.
if Zeilenanzahl = Sek.Count-1 then exit;
|
Re: Spaltenweise auf TStringList zugreifen
Handelt es sich num um eine Methode oder eine freie Prozedur?
|
Re: Spaltenweise auf TStringList zugreifen
Zitat:
Dem was mkinzler geschrieben hat kann ich nur voll zustimmen... Was Debuggen angeht: ![]() ![]() ![]() ![]() Allgemein: ![]() // EDIT: Ah, hat es doch geklappt mit dem Haltepunkt. :D Ja, wenn da Self nil ist, dann besteht das Objekt an der Stelle nicht, dann hast du auch keinen Zugriff auf Properties. Das habe ich mir schon gedacht. Das kann verschiedene Ursachen haben, z.B. dass das Objekt da wieder freigegeben / noch nicht erstellt wurde, etc. Erstellst du das Formular manuell? Die Methode wird durch einen Timer aufgerufen? Ist das im Objektinspektor zugewiesen oder rufst du da etwas manuell auf? |
Re: Spaltenweise auf TStringList zugreifen
Zitat:
Delphi-Quellcode:
//Timer für ZehnMinDatei zur Laufzeit erstellen
MyTimer2 := TTimer.Create(nil); MyTimer2.Enabled := True; MyTimer2.Interval := 3000; // alle 3 Sekunden die 10MinDatei aktualisieren MyTimer2.OnTimer := MomFiles.ZehnMinTimerEvent; |
Re: Spaltenweise auf TStringList zugreifen
So etwas dachte ich mir schon fast, dass du da direkt auf eine bestimmte Instanz (MomFiles) zugreifst.
Kann es sein, dass du das in OnCreate von TMomFiles oder so durchführst? Dann (und generell, wenn das in TMomFiles passiert) lass das MomFiles. weg... Oder dass du MomFiles manuell erzeugst und wieder freigibst? |
Re: Spaltenweise auf TStringList zugreifen
Mein TMomFiles hat kein OnCreate.
Delphi-Quellcode:
MyTimer2.OnTimer := ZehnMinTimerEvent;
Zitat:
Delphi-Quellcode:
type
TMomFiles=class(TForm) private FZeilenanzahl : integer; { Private-Deklarationen } public { Public-Deklarationen } procedure DreiSekDateiErstellen; procedure ZehnMinDateiErstellen; procedure DreiSekDateiFuellen(const Filename: string); procedure ZehnMinDateiFuellen(const Filename: string); procedure DreiSekTimerEvent(Sender: TObject); procedure ZehnMinTimerEvent(Sender: TObject); procedure WerteBerechnen; property Zeilenanzahl: Integer Read FZeilenanzahl Write FZeilenanzahl; end; |
Re: Spaltenweise auf TStringList zugreifen
Ja, aber das meinte ich nicht. Erstellst du MomFiles manuell oder wird das Formular automatisch von Delphi erstellt?
Und wo wird der Timer erstellt? |
Re: Spaltenweise auf TStringList zugreifen
Der Timer wird in
Delphi-Quellcode:
erzeugt.
procedure TMomFiles.DreiSekDateiFuellen(const Filename: string);
Ich erstelle es nicht,denke ich. Zumindestens nicht bewusst. :pale: |
Re: Spaltenweise auf TStringList zugreifen
Guten Morgen,
was Sebastian meint ist, führst Du irgendwo
Delphi-Quellcode:
aus?
momFiles := TMomFiles.create
Wenn nicht dann hast Du zwar eine Klasse TMomFiles aber nirgendwo eine Instanz mit der Du arbeiten könntest. Grüße Klaus |
Re: Spaltenweise auf TStringList zugreifen
ich führe nur
Delphi-Quellcode:
aus
MomFiles: TMomFiles;
Wo muss das denn hin mit dem create? Und was muss in die klammer von create() ? |
Re: Spaltenweise auf TStringList zugreifen
Ich finde es echt toll, dass du so standfest bist, dich gegen das Grundlagenwissenstudium zu stemmen!
Aber ich hoffe du verstehst das man dir hier in Zukunft dann nicht mehr helfen will/kann. |
Re: Spaltenweise auf TStringList zugreifen
Genau, und um hier länger herumzuraten habe ich weder Zeit noch Lust. Jetzt muss ich erst einmal zur Arbeit.
Wenn du dann bis heute Abend (ich komme gegen 22 Uhr wieder nach Hause) dein Projekt anhängst, würde ich es mir einmal kurz anschauen, dann sehe ich sicher schnell den Fehler. Aber du musst dich eben mit den Grundlagen beschäftigen, sonst nutzt dir das dann auch wenig, wenn ich dir diesmal den Fehler nennen kann... |
Re: Spaltenweise auf TStringList zugreifen
Ist ok.Trotzdem Danke
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:16 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 by Thomas Breitkreuz