Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Spaltenweise auf TStringList zugreifen (https://www.delphipraxis.net/137708-spaltenweise-auf-tstringlist-zugreifen.html)

aaaaaaaaaa_10 29. Jul 2009 09:41

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?

hoika 29. Jul 2009 09:54

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

aaaaaaaaaa_10 29. Jul 2009 10:07

Re: Spaltenweise auf TStringList zugreifen
 
Zitat:

du sollst es ja auch im TimeEvent prüfen.
Gleich als 1. Code.
Aber da weiß ich ja die Zeilenanzahl noch nicht, weil die ja erst im Laufe des Codes aus

Delphi-Quellcode:
 Sek.LoadFromFile(DreiSek);
verwendbar gemacht wird. Blick net durch.

aaaaaaaaaa_10 29. Jul 2009 11:06

Re: Spaltenweise auf TStringList zugreifen
 
Weiß niemand Rat?

jaenicke 29. Jul 2009 11:43

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.

aaaaaaaaaa_10 29. Jul 2009 12:05

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;

jaenicke 29. Jul 2009 12:46

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:
var Zeilenanzahl, linenum : integer;
begin
   try
      Sek.LoadFromFile(DreiSek);
      if Zeilenanzahl = Sek.Count - 1 then
        Exit;

      Zeilenanzahl := Sek.Count - 1;
              .......
   finally ...
   end;
end;
// EDIT:
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)...

aaaaaaaaaa_10 29. Jul 2009 12:59

Re: Spaltenweise auf TStringList zugreifen
 
Mit :
Delphi-Quellcode:
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;
gibt es eine Zuzgriffsverletzung.

jaenicke 29. Jul 2009 13:12

Re: Spaltenweise auf TStringList zugreifen
 
Dann musst du schauen wo.

aaaaaaaaaa_10 29. Jul 2009 13:16

Re: Spaltenweise auf TStringList zugreifen
 
Wie finde ich denn die Adresse, die in der Zugriffsverletzung geg ist?

aaaaaaaaaa_10 29. Jul 2009 13:36

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;

aaaaaaaaaa_10 29. Jul 2009 14:43

Re: Spaltenweise auf TStringList zugreifen
 
Woran kann das liegen? Hab ich die Property falsch deklariert?oder etwas vergessen

DeddyH 29. Jul 2009 14:48

Re: Spaltenweise auf TStringList zugreifen
 
Bitte nicht vor Ablauf von 24 Stunden pushen :warn:

xZise 29. Jul 2009 16:22

Re: Spaltenweise auf TStringList zugreifen
 
Eine Zugriffsverletzung bekommt man meißtens wenn man etwas nicht erstellt hat:
Das hier geht wunderbar
Delphi-Quellcode:
Meins := TStringList.Create;
try
  // Mit "Meins" arbeiten
  // z.B. eine Zeile hinzufügen
  Meins.Add('Hallo Welt');
finally
  Meins.Free;
end;
Während das hier zur einer AV (= Accessviolatuion = Zugriffsverletzung) führt:
Delphi-Quellcode:
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;
Ich tippe mal darauf (ausgehend von dem Codestück aus dem Post #47), dass Sek nicht erstellt wurde.
Könntest du uns vielleicht mal etwas mehr Code zeigen? Also alles bis zum Exit dürfte erstmal reichen.

MfG
xZise

aaaaaaaaaa_10 30. Jul 2009 06:21

Re: Spaltenweise auf TStringList zugreifen
 
Ok, also bis zum xis sieht das so aus:

Delphi-Quellcode:
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;
Zeileananzahl habe ich als property deklariert und da wird auch irgendwo der Knackpunkt sein. Sek wurde bereits erstellt. (u.a. in #20 sichtbar)

jaenicke 30. Jul 2009 06:31

Re: Spaltenweise auf TStringList zugreifen
 
Zitat:

Zitat von aaaaaaaaaa_10
Delphi-Quellcode:
procedure ZehnMinTimerEvent(Sender: TObject);
var

Moment mal...
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:

aaaaaaaaaa_10 30. Jul 2009 06:42

Re: Spaltenweise auf TStringList zugreifen
 
Delphi-Quellcode:
procedure ZehnMinTimerEvent(Sender: TObject);
ach gott, nee da steht eigentlich

Delphi-Quellcode:
procedure TMomFiles.ZehnMinTimerEvent(Sender: TObject);

jaenicke 30. Jul 2009 06:47

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.

aaaaaaaaaa_10 30. Jul 2009 06:53

Re: Spaltenweise auf TStringList zugreifen
 
Wenn ich F7 drücke, passiert aber nix.

jaenicke 30. Jul 2009 06:54

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.

aaaaaaaaaa_10 30. Jul 2009 06:58

Re: Spaltenweise auf TStringList zugreifen
 
Da steht überall Prozess nicht verfügbar

mkinzler 30. Jul 2009 07:00

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.

aaaaaaaaaa_10 30. Jul 2009 07:09

Re: Spaltenweise auf TStringList zugreifen
 
Also ich habe jetzt mal bei
Delphi-Quellcode:
if Zeilenanzahl = Sek.Count-1 then exit;
einen Haltepunkt gesetzt und da ist self nil.

mkinzler 30. Jul 2009 07:12

Re: Spaltenweise auf TStringList zugreifen
 
Handelt es sich num um eine Methode oder eine freie Prozedur?

jaenicke 30. Jul 2009 07:12

Re: Spaltenweise auf TStringList zugreifen
 
Zitat:

Zitat von aaaaaaaaaa_10
Da steht überall Prozess nicht verfügbar

Dann ist das Programm noch nicht an dem Haltepunkt angekommen...

Dem was mkinzler geschrieben hat kann ich nur voll zustimmen...

Was Debuggen angeht:
http://www.delphipraxis.net/internal...t.php?p=326079
http://www.delphi-treff.de/delphi-ide/debugger/
http://www.delphi-treff.de/delphi-ide/haltepunkte/
http://www.delphi-treff.de/delphi-id...te-ausdruecke/
Allgemein:
http://www.christian-stelzmann.de/in...ials_crashkurs

// 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?

aaaaaaaaaa_10 30. Jul 2009 07:28

Re: Spaltenweise auf TStringList zugreifen
 
Zitat:

Die Methode wird durch einen Timer aufgerufen? Ist das im Objektinspektor zugewiesen oder rufst du da etwas manuell auf?
Den Timer rufe ich mit folgendem Code auf :
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;

jaenicke 30. Jul 2009 07:36

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?

aaaaaaaaaa_10 30. Jul 2009 07:43

Re: Spaltenweise auf TStringList zugreifen
 
Mein TMomFiles hat kein OnCreate.

Delphi-Quellcode:
 MyTimer2.OnTimer := ZehnMinTimerEvent;
Zitat:

Oder dass du MomFiles manuell erzeugst und wieder freigibst?
Das ist meine TMomFiles Klasse:
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;

jaenicke 30. Jul 2009 07:46

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?

aaaaaaaaaa_10 30. Jul 2009 07:48

Re: Spaltenweise auf TStringList zugreifen
 
Der Timer wird in
Delphi-Quellcode:
procedure TMomFiles.DreiSekDateiFuellen(const Filename: string);
erzeugt.
Ich erstelle es nicht,denke ich. Zumindestens nicht bewusst. :pale:

Klaus01 30. Jul 2009 08:07

Re: Spaltenweise auf TStringList zugreifen
 
Guten Morgen,

was Sebastian meint ist, führst
Du irgendwo
Delphi-Quellcode:
momFiles := TMomFiles.create
aus?
Wenn nicht dann hast Du zwar eine Klasse TMomFiles
aber nirgendwo eine Instanz mit der Du arbeiten könntest.

Grüße
Klaus

aaaaaaaaaa_10 30. Jul 2009 08:27

Re: Spaltenweise auf TStringList zugreifen
 
ich führe nur
Delphi-Quellcode:
MomFiles: TMomFiles;
aus
Wo muss das denn hin mit dem create? Und was muss in die klammer von create() ?

mkinzler 30. Jul 2009 08:36

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.

jaenicke 30. Jul 2009 09:04

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

aaaaaaaaaa_10 30. Jul 2009 09:10

Re: Spaltenweise auf TStringList zugreifen
 
Ist ok.Trotzdem Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:25 Uhr.
Seite 2 von 2     12   

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