Autor Beitrag
bonanza
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: So 28.10.07 10:06 
Hi,


ich habe folgendes Problem:

Ich lese eine textdatei als stringlist ein und durchsuche diese dann. Wenn der eintrag X in Zeile Y gefunden wurde, dann soll Zeile wo Eintrag X drin ist gelöscht werden und dann in genau der selben Zeile ein neuer String mit "stringlist.insert" eingfügt werden.

Doch dabei tritt immer ein ElistError auf, angeblich wird das Listenmaximum überschritten, was aber definitiv nicht sein kann, da nur bist datei.count-1 durchsucht wird.
ausblenden Delphi-Quelltext
1:
2:
3:
for zeilennr:=0 to datei.Count-1 do
    if datei[zeilennr]='XXX' then
      datei[zeilennr]:='XXX+YYY';


aus der Delphi Hilfe:


Beschreibung zu EListError:
Zitat:
EListError ist die Exception-Klasse für Fehler, die in Verbindung mit Strings und Listen auftreten.

Klassenhierarchie

Pascal
EListError = class(Exception);
Datei
Classes

Beschreibung
EListError wird ausgelöst, wenn ein Fehler in einem Listen-, TStrings- oder TStringList-Objekt auftritt. Die häufigste Ursache ist, dass die Anwendung auf einen Eintrag verweist, der außerhalb des Listenbereichs liegt.

EListError wird außerdem ausgelöst, wenn eine Anwendung versucht, das Duplikat eines Strings zu einem TStringList-Objekt hinzuzufügen, während die Eigenschaft Duplicates den Wert dupError hat.

Eine weitere Ursache für eine EListError-Exception ist der Versuch, einen String an bestimmter Position in eine sortierte Liste einzufügen, wodurch die Sortierreihenfolge unterbrochen werden könnte.


Beschreibung zu TStringlist.Insert:
Zitat:
Beschreibung
Mit Insert können Sie der Liste den String S an der mit Index bezeichneten Position hinzufügen. Wenn Index 0 ist, wird der String am Anfang der Liste eingefügt. Ist Index 1, wird der String an der zweiten Position eingefügt usw.

Ist dem einzufügenden String ein Objekt zugeordnet, muss die Methode InsertObject verwendet werden.

Anmerkung: Bei einer sortierten Liste verursacht der Aufruf von Insert oder InsertObject eine EListError-Exception. Verwenden Sie deshalb bei sortierten Listen Add oder AddObject.


Das Problem ist eben, dass es keine sortierte Liste ist, da ich den Text aus einer Datei einlese und ich es nicht sortieren darf.

Wie kann ich das problem lösen?


vielen Dank für eure Hilfe im voraus!
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 28.10.07 11:32 
sag mal, was hälte davon, den eintrag einfach auszutauschen? statt delete und insert??
ansonsten, die liste vom schwanz her aufzäumen....
bonanza Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: So 28.10.07 13:09 
verstehe nicht so ganz was du damit meinst...könntest du mir ein beispiel geben ?


danke schonmal!
bonanza Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: So 28.10.07 13:44 
der Vollständigkeit halber die komplette prozedur:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
procedure TForm1.speichernClick(Sender: TObject);
var baseengine, kellerengine, blur, ShadowDepthTest: TStringList;
  zeilennr: integer;
  wert:string;
begin
  baseengine:=TStringList.Create;
  kellerengine :=TStringList.Create;
  blur :=TStringList.Create;
  ShadowDepthTest:=TStringList.Create;

  baseengine.LoadFromFile(dir+'\Engine\Config\BaseEngine.ini');
  kellerengine.LoadFromFile(dir+'\KellerGame\Config\PC\KellerEngine.ini');
  blur.LoadFromFile(dir+'\Engine\Shaders\HLSL\MegaPostProcess\Blur.hlsl');
  ShadowDepthTest.LoadFromFile(dir+'\Engine\Shaders\HLSL\ShadowDepthTest.hlsl');

  try
      if tab1_nachbearbeitung_komplett.checked=true then begin
      showmessage(inttostr(baseengine.Count-1));
            for zeilennr:=0 to baseengine.Count-1 do
                if baseengine[zeilennr]='bUsePostProcessEffects' then
                  baseengine[zeilennr]:='bUsePostProcessEffects=False';
            for zeilennr:=0 to kellerengine.Count-1 do
                if  kellerengine[zeilennr]='bUsePostProcessEffects' then
                 kellerengine[zeilennr]:='bUsePostProcessEffects=False';
     end else begin
            for zeilennr:=0 to baseengine.Count-1 do
                if baseengine[zeilennr]='bUsePostProcessEffects' then
                  baseengine[zeilennr]:='bUsePostProcessEffects=True';
            for zeilennr:=0 to kellerengine.Count-1 do
                if  kellerengine[zeilennr]='bUsePostProcessEffects' then
                 kellerengine[zeilennr]:='bUsePostProcessEffects=True';
     end;

//  [...] noch weitere if-bedingungen, die aber für den Test ausgeklammert wurden.

  baseengine.SaveToFile(dir+'\Engine\Config\BaseEngine.ini');
  kellerengine.SaveToFile(dir+'\KellerGame\Config\PC\KellerEngine.ini');
  blur.SaveToFile(dir+'\Engine\Shaders\HLSL\MegaPostProcess\Blur.hlsl');
  ShadowDepthTest.SaveToFile(dir+'\Engine\Shaders\HLSL\ShadowDepthTest.hlsl');

  finally
    baseengine.free;
    kellerengine.free;
    blur.free;
    ShadowDepthTest.free;
  end;
end;
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: So 28.10.07 15:20 
Und wo tritt der Fehler auf? Das er nicht auftreten dürfte, sehe ich nämlich auch.

_________________
Na denn, dann. Bis dann, denn.