Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStringlist leert sich Selbst! (https://www.delphipraxis.net/166966-tstringlist-leert-sich-selbst.html)

danu1104 7. Mär 2012 19:33

Delphi-Version: 7

TStringlist leert sich Selbst!
 
Hallo :-)

Ich versuche seit stunden ,eine einfache TStringlist mit einfachen Strings zu füllen, doch bereits nach dem Add() eine zeile darunter ist die Liste wieder leer , obwohl ich überhaupt nix leere.


Delphi-Quellcode:
var
varvalue:TStringlist;
varvalueex:TStringlist;

function getvarval(str:Pchar):Pchar;
var ic:Integer;
begin
  varvalue.LoadFromFile('c:\ls.dat');
  varvalueex.DelimitedText:= varvalue.text;
  for ic:=0 to varvalueex.Count -1 do
   if VarValueex.Strings[ic] = str then Begin
    result:=Pchar(VarValueex.Strings[ic+1]);
    Break;
   end;
   showmessage(VarValueEx.Text)
end;

 VarValue:=TStringlist.Create;

 VarValueEx:=TStringlist.Create;
 VarValueEx.Delimiter:='=';

  varvalue.Add('test=hallo');
// und hier ist sie wieder leer ich weiss es nicht zuletzt weil ls.dat 0KB gross ist.
// Achja, dass Project Ist eine DLL
  varvalue.SaveToFile('c:\ls.dat');
Ich würde mich freuen , wenn mir mal jemand in den nacken kloppt, und mir zeigt was ich falsch mache, weil ich weiß nicht mehr was logic ist.

PS: Habe einen EStringlistError mit

Delphi-Quellcode:
 
try
 test() ....
except
  On e : EStringlistError do

     //

  Else

     //


 end;
abgefangen. weil der error meine app ewig crasht ,selbst nach aufräumen des codes, weshalb auch immer. Die listen werden allle vernüftig erstellt und wieder geschlossen von mir.

Uwe Raabe 7. Mär 2012 19:40

AW: TStringlist leert sich Selbst!
 
Zitat:

Zitat von danu1104 (Beitrag 1155229)
PS: Habe einen EStringlistError mit

Delphi-Quellcode:
 
try
 test() ....
except
  On e : EStringlistError do

     //

  Else

     //


 end;
abgefangen. weil der error meine app ewig crasht und ich nach aufräumen des codes immer noch habe, weshalb auch immer. Die listen werden allle vernüftig erstellt und wieder geschlossen.

Das ist ja wohl seit mit das Dümmste, was ich je gehört habe! Der Fehler ruft dir sozusagen zu Hier bin ich! und du hörst nicht hin...

danu1104 7. Mär 2012 19:43

AW: TStringlist leert sich Selbst!
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1155234)
Zitat:

Zitat von danu1104 (Beitrag 1155229)
PS: Habe einen EStringlistError mit

Delphi-Quellcode:
 
try
 test() ....
except
  On e : EStringlistError do

     //

  Else

     //


 end;
abgefangen. weil der error meine app ewig crasht und ich nach aufräumen des codes immer noch habe, weshalb auch immer. Die listen werden allle vernüftig erstellt und wieder geschlossen.

Das ist ja wohl seit mit das Dümmste, was ich je gehört habe! Der Fehler ruft dir sozusagen zu Hier bin ich! und du hörst nicht hin...

Ich habe den fehler hoch und runter gesucht , ich habe ihn nicht gefunden auch nach hilfe im web (http://www.umnicom.de/Software/Delph...xceptions.html) nicht.

Zitat:

EStringListError

EStringListError ist die Exception-Klasse für ungültige Referenzen auf Listenfelder.

Unit: classes

Beschreibung

EStringListError wird ausgelöst, wenn eine Anwendung versucht, mit einem ungültigen Index auf ein Listenfeld zuzugreifen, um beispielsweise einen Eintrag hinzuzufügen.
Und der code ist nicht gross. Also habe ich ihn unterdrückt damit das Programm wieder läuft

Keldorn 7. Mär 2012 19:53

AW: TStringlist leert sich Selbst!
 
Hallo

Delphi-Quellcode:
  for ic:=0 to varvalueex.Count -1 do
    if VarValueex.Strings[ic] = str then Begin
     result:=Pchar(VarValueex.Strings[ic+1]); //***
//***--> kann beim letzten Element durch das +1 nicht gutgehen

Gruß Frank

haentschman 7. Mär 2012 19:55

AW: TStringlist leert sich Selbst!
 
Hallo... ist der Quelltext aus #1 alles ? Zeige mal ein wenig mehr... Der Ausschnitt sagt gar nix.

himitsu 7. Mär 2012 23:31

AW: TStringlist leert sich Selbst!
 
Ja, Fehlermeldungen sollte man gefälligst beachten.
Wenn man die einfach so mutwillig/fahrlässig misachtet, dann soll man sich auch nicht Wundern, wenn es irgendwo knallt.

Was saggt denn der Debugger?
Ich empfehle auch einen Blick in das Menü "Start" und dort in Parameter.



Delphi-Quellcode:
function getvarval(str:Pchar):Pchar;
begin

    result:=Pchar(VarValueex.Strings[ic+1]);

end;
Und ich empfehle dir ganz dringend ein Tutorial über Pointer.

Daß es bei der TStringList nicht sofort knallt, ist ein Zufall und auf Grund der internen Speicherverwaltung der TStringList begründet.
Aber eigentlich sollte man besser keinen Pointer auf etwas zurückgeben, was nach der Funktion nicht mehr existieren könnte, wie z.B. eine Stringvariable.


Anhand des bissl veröffentlichten Codes (man soll ja schließlich alles Wichtige zeigen, also kann da nichts Wichtiges uns Unbekanntes mehr existieren), wird VarValue und damit auch VarValueEx zu Beginn der Funktion jedesmal neu geladen.
Wozu sind das dann globale Variablen, obwohl sie doch offenbar nur eine lokale Funktion ausüben?

Sir Rufo 8. Mär 2012 05:55

AW: TStringlist leert sich Selbst!
 
Evtl. ist der Delimiter ungeschickt gewählt, weil sich das mit dem NameValueSeparator beißt.

Versuch es mal mit dieser Änderung - die function lasse ich jetzt mal untouched:
Delphi-Quellcode:
var
varvalue:TStringlist;
varvalueex:TStringlist;

...

  VarValue:=TStringlist.Create;

  VarValueEx:=TStringlist.Create;
  // VarValueEx.Delimiter:='=';

  varvalue.Values['test'] := 'hallo';
  // und hier ist sie wieder leer ich weiss es nicht zuletzt weil ls.dat 0KB gross ist.
  // Achja, dass Project Ist eine DLL
  varvalue.SaveToFile('c:\ls.dat');

danu1104 8. Mär 2012 08:12

AW: TStringlist leert sich Selbst!
 
Ich habe jetzt


Delphi-Quellcode:
try
 test() ....
except
  On e : EStringlistError do
 end;
entfernt , und das Resultat ist das die listen jetzt voll bleiben (juhuu) , doch habe ich den EStringlistError der mir die App immer crasht.

unter var deklariere ich die stringlisten create sie dort wo sie gebraucht werden und schliesse sie am ende der Function wieder. Deswegen kann ich den fehler nicht nachvollziehen. Ich habe nur diese 2 - 3 Stringlisten, und ich habe noch nie diesen fehler gehabt, seit ich mit delphi arbeite ....

Bernhard Geyer 8. Mär 2012 08:31

AW: TStringlist leert sich Selbst!
 
Böses böses Speichern unter C:\.

Win Vista/7 wird das verhindern (Keine Schreibzugriff) bzw. in den Virtuellen Store Umschieben so das du deine Änderungen im Windows Explorer unter C:\ nicht sieht.

Klaus01 8. Mär 2012 08:31

AW: TStringlist leert sich Selbst!
 
.. wo kommt denn diese Funktion zum Einsatz?

Delphi-Quellcode:
function getvarval(str:Pchar):Pchar;
var ic:Integer;
begin
  varvalue.LoadFromFile('c:\ls.dat');
  varvalueex.DelimitedText:= varvalue.text;
  for ic:=0 to varvalueex.Count -1 do
   if VarValueex.Strings[ic] = str then Begin
    result:=Pchar(VarValueex.Strings[ic+1]);
    Break;
   end;
   showmessage(VarValueEx.Text)
end;
Ich würde die StringList auch als Parameter übergeben.

Delphi-Quellcode:
function getvarval(var myStringList: TStringList;str:Pchar):Pchar;
 var ic:Integer;
 sl : TStringList;
begin
  if assigned(myStringList) then
    begin
      sl := TStringList.create;
      try
         sl.LoadFromFile('c:\ls.dat');
         myStringList.DelimitedText:= sl.Ttext;
         for ic:=0 to myStringList.Count -2 do
           if myStringList.Strings[ic] = str then
             Begin
               result:=Pchar(myStringList.Strings[ic+1]);
               Break;
             end;
          showmessage(myStringList.Text)
      finally
        sl.free;
      end;
    end;
end;
Grüße
Klaus

TiGü 8. Mär 2012 08:32

AW: TStringlist leert sich Selbst!
 
Zitat:

Zitat von danu1104 (Beitrag 1155315)
unter var deklariere ich die stringlisten create sie dort wo sie gebraucht werden und schliesse sie am ende der Function wieder. Deswegen kann ich den fehler nicht nachvollziehen. Ich habe nur diese 2 - 3 Stringlisten, und ich habe noch nie diesen fehler gehabt, seit ich mit delphi arbeite ....

Wenn man Beiträge dreimal Lesen muss, damit man etwas versteht, fehlt es an allen grundlegenen Kenntnissen der deutschen Rechtschreibung! :shock:

Die Lösung wurde im vierten Post in diesen Thread genannt.

danu1104 8. Mär 2012 08:43

AW: TStringlist leert sich Selbst!
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1155317)
Böses böses Speichern unter C:\.

Win Vista/7 wird das verhindern (Keine Schreibzugriff) bzw. in den Virtuellen Store Umschieben so das du deine Änderungen im Windows Explorer unter C:\ nicht sieht.

System Festplate ist I:\ , c:\ ist meine backup platte

danu1104 8. Mär 2012 08:49

AW: TStringlist leert sich Selbst!
 
Zitat:

Zitat von TiGü (Beitrag 1155319)
Zitat:

Zitat von danu1104 (Beitrag 1155315)
unter var deklariere ich die stringlisten create sie dort wo sie gebraucht werden und schliesse sie am ende der Function wieder. Deswegen kann ich den fehler nicht nachvollziehen. Ich habe nur diese 2 - 3 Stringlisten, und ich habe noch nie diesen fehler gehabt, seit ich mit delphi arbeite ....

Wenn man Beiträge dreimal Lesen muss, damit man etwas versteht, fehlt es an allen grundlegenen Kenntnissen der deutschen Rechtschreibung! :shock:

Die Lösung wurde im vierten Post in diesen Thread genannt.

Schwachsinn, ob ich es so mache: [ic+1] oder nicht es bleibt das gleiche. Zumal ist der fehler aufgetretten, bevor ich diese Function geschrieben habe.

Wenn du nur über meiner Rechtschreibung dir deinen Kopf zerbrichst , dann lass mich bitte selber den fehler finden, und werde Deutsch Lehrer.

Lemmy 8. Mär 2012 08:51

AW: TStringlist leert sich Selbst!
 
Zitat:

Zitat von danu1104 (Beitrag 1155315)

entfernt , und das Resultat ist das die listen jetzt voll bleiben (juhuu) , doch habe ich den EStringlistError der mir die App immer crasht.



Aus der Delphi-Hilfe:
Zitat:

EStringListError wird ausgelöst, wenn eine Anwendung versucht, mit einem ungültigen Index auf ein Listenfeld zuzugreifen, um beispielsweise einen Eintrag hinzuzufügen.
hast Du schon mal den Debugger angeworfen und geschaut WO, d.h. in welcher Zeile die Exception geworfen wird?

jaenicke 8. Mär 2012 08:59

AW: TStringlist leert sich Selbst!
 
Zitat:

Zitat von Klaus01 (Beitrag 1155318)
Ich würde die StringList auch als Parameter übergeben.

Aber sinnvoller wäre das nicht als var-Parameter zu machen. Schließlich übergibst du dann einen Pointer auf einen Pointer, da die TStringList ja schon selbst ein Pointer auf das Objekt ist.

danu1104 8. Mär 2012 08:59

AW: TStringlist leert sich Selbst!
 
Zitat:

Zitat von Lemmy (Beitrag 1155323)
Zitat:

Zitat von danu1104 (Beitrag 1155315)

entfernt , und das Resultat ist das die listen jetzt voll bleiben (juhuu) , doch habe ich den EStringlistError der mir die App immer crasht.



Aus der Delphi-Hilfe:
Zitat:

EStringListError wird ausgelöst, wenn eine Anwendung versucht, mit einem ungültigen Index auf ein Listenfeld zuzugreifen, um beispielsweise einen Eintrag hinzuzufügen.
hast Du schon mal den Debugger angeworfen und geschaut WO, d.h. in welcher Zeile die Exception geworfen wird?

Debugger? Also es handel sich um eine DLL , die function exportiere ich mit stdcall und rufe sie in einer Consolen - APP auf, das lief bislang wunderbar, bis ich gestern Delphi geöffnet habe um am Project weiter zu knibbeln, nach dem Build der DLL kiamm dann das 1. mal der EStringlistError, wobei ich garnix getan habe.

Habe erst gedacht es wer ein Ressource Problem und habe deswegen *.res entfernt was jedoch nix bewirkte. Daraufhin habe ich alle String Variablen in Pchar umgeschrieben, auch keine lösung. Alle Stringlisten global deklariert, auch nicht.


hier die function:


Delphi-Quellcode:
function scripting(cmd:Pchar):Pchar; STDCALL;
Var
 p:pchar;
 ist:tfilestream;
begin

if Length(CMD) < 1 then
begin
 Exit;
end;
 //global
 Op:=TStringlist.Create;
 Op.Delimiter:=' ';
 Op.DelimitedText:=CMD;
 //global
 VarValue:=TStringlist.Create;

 //global
 gvarname:=TStringlist.Create;
 gvarname.Delimiter:='.';
 gvarname.DelimitedText:=CMD;



 P:=Pchar(ExtractFilePath(Paramstr(0)));

if gvarname.Strings[0] = 'global' then
  begin
    varvalue.Add(gvarname.Strings[1]);
  end;


  if Op.Strings[0] = 'sound_init' then
  begin
   win:=0;
  if (HIWORD(BASS_GetVersion) <> BASSVERSION) then
  begin
    MessageBox(0, 'An incorrect version of BASS.DLL was loaded', nil, MB_ICONERROR);
    Exit;
  end;
  if (not BASS_Init(-1, 44100, 0,win, nil)) then
  begin
    Exit;
  end;
  end else
  if Op.Strings[0] = 'sound_file' then
  begin
   if Op.Strings[1] = getvarval(varvalue,Pchar(Op.Strings[1])) then
     //   strs := BASS_StreamCreateFile(False, Pchar(getvarval(varvalue,Pchar(Op.Strings[1]))), 0, 0, 0)
    else
      strs := BASS_StreamCreateFile(False, Pchar(Op.Strings[1]), 0, 0, 0);
  end else
  if Op.Strings[0] = 'sound_play' then
  begin
   BASS_ChannelPlay(strs, False);
  end else
  if (Op.Strings[0] = '__run') then
   if not (Op.Strings[1] = 'while.playing') then
    Delay(StrToInt(Op.Strings[1]))
   else begin
   repeat
      Delay(1)
     until
      BASS_ChannelIsActive(strs)= BASS_ACTIVE_STOPPED
    end;
   if (Op.Strings[1] = 'while.taskkill') then
    repeat
      Delay(1)
     until false
  else
  if Op.Strings[0] = 'sound_stop' then
  begin
   BASS_ChannelStop(strs);
  end else
  if Op.Strings[0] = 'end' then
  begin

   Application.Terminate;
   Exit;
  end else
end;
script aus datei:

Zitat:

global.testvar="data\usr\local\tracks\jd.mp3"
sound_init
sound_file testvar
sound_play
__run while.playing


Und deswegen verstehe ich es nicht, das ist so übersichtlich, wie kann da solch ein fehler sein

Lemmy 8. Mär 2012 09:06

AW: TStringlist leert sich Selbst!
 
Zitat:

Zitat von danu1104 (Beitrag 1155326)
Debugger? Also es handel sich um eine DLL ,

ist kein Grund den Debugger nicht auch anzuwerfen - entweder du verwendest "Mit Prozess verbinden" oder du schneidest die Funktion aus der DLL und fügst die in ein leeres Projekt rein, dann kannst Du da debuggen und wenn das Teil läuft kannst Du die Funktion wieder in die DLL packen.

Sinnvoller weise packst Du die Funktion eh in eine eigene Unit, die kannst Du dann zum weiterentwickeln / debuggen in ein normales Projekt einbinden und wenn sie läuft über das DLL Projekt als DLL zur Verfügung stellen.

GRüße

danu1104 8. Mär 2012 09:11

AW: TStringlist leert sich Selbst!
 
Zitat:

Zitat von Lemmy (Beitrag 1155328)
Zitat:

Zitat von danu1104 (Beitrag 1155326)
Debugger? Also es handel sich um eine DLL ,

ist kein Grund den Debugger nicht auch anzuwerfen - entweder du verwendest "Mit Prozess verbinden" oder du schneidest die Funktion aus der DLL und fügst die in ein leeres Projekt rein, dann kannst Du da debuggen und wenn das Teil läuft kannst Du die Funktion wieder in die DLL packen.

Sinnvoller weise packst Du die Funktion eh in eine eigene Unit, die kannst Du dann zum weiterentwickeln / debuggen in ein normales Projekt einbinden und wenn sie läuft über das DLL Projekt als DLL zur Verfügung stellen.

GRüße

schau mal den beitrag über dir, habe code hinzugefügt

himitsu 8. Mär 2012 09:15

AW: TStringlist leert sich Selbst!
 
Zitat:

Zitat von Klaus01 (Beitrag 1155318)
.. wo kommt denn diese Funktion zum Einsatz?

Ich würde die StringList auch als Parameter übergeben.

Delphi-Quellcode:
function getvarval(var myStringList: TStringList;str:Pchar):Pchar;

Es geht um eine DLL-Funktion.

Solange er nicht mit Laufzeitpackages kompiliert, würde ich davon eher abraten, Objekte über RTTI-Grenzen hinweg zu übergeben.

Bernhard Geyer 8. Mär 2012 09:23

AW: TStringlist leert sich Selbst!
 
Zitat:

Zitat von danu1104 (Beitrag 1155321)
System Festplate ist I:\ , c:\ ist meine backup platte

Und wie hast du das hin bekommen?
Ab Vista sorgt doch der Installer von Windows dafür das für Windows die Systemplatte immer C:\ ist egal welche Partition/Platte es physikalisch ist :gruebel:

Lemmy 8. Mär 2012 09:31

AW: TStringlist leert sich Selbst!
 
Zitat:

Zitat von danu1104 (Beitrag 1155329)
schau mal den beitrag über dir, habe code hinzugefügt

äh, ja und? Neben den div. globalen Variablen hast Du noch andere Methodenaufrufe drin, glaubst Du ernsthaft ich setz mich jetzt ne Stunde lang hin und versuch das Zeug zum Laufen zu bekommen? Davon mal abgesehen wer sagt denn, dass nicht einer der Methodenaufrufe den Fehler verursacht?


Grüße

danu1104 8. Mär 2012 09:33

AW: TStringlist leert sich Selbst!
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1155336)
Zitat:

Zitat von danu1104 (Beitrag 1155321)
System Festplate ist I:\ , c:\ ist meine backup platte

Und wie hast du das hin bekommen?
Ab Vista sorgt doch der Installer von Windows dafür das für Windows die Systemplatte immer C:\ ist egal welche Partition/Platte es physikalisch ist :gruebel:

Habe Windows XP drauf, und hatte vorher Ubuntu auf der 80er Platte, die 80er habe ich formatiert und die 500GB natürlich nicht, seit dem ist System Laufwerk bei mir I:\ weil die 500GB bei der Installation bereits als C:\ angezeigt wurde , daher hat er auf I:\ gemacht (nicht zuletzt weil ich Card Reader laufwerke habe)

danu1104 8. Mär 2012 09:38

AW: TStringlist leert sich Selbst!
 
Zitat:

Zitat von Lemmy (Beitrag 1155337)
Zitat:

Zitat von danu1104 (Beitrag 1155329)
schau mal den beitrag über dir, habe code hinzugefügt

äh, ja und? Neben den div. globalen Variablen hast Du noch andere Methodenaufrufe drin, glaubst Du ernsthaft ich setz mich jetzt ne Stunde lang hin und versuch das Zeug zum Laufen zu bekommen? Davon mal abgesehen wer sagt denn, dass nicht einer der Methodenaufrufe den Fehler verursacht?


Grüße

ich werde die function komplett löschen und alles neu aufbauen, wie gesagt ich hatte den fehler vorher nicht. Und das es an den Methodenaufrufe liegt kann durch aus sein, da es mit try ... except on e : ... end; funktioniert ohne EStringlistError, aber die listen sich direkt wieder leeren nach dem füllen.

Naja Danke @ all , ich werde halt nochmal neu anfangen :-)

Alien_F 8. Mär 2012 09:49

AW: TStringlist leert sich Selbst!
 
Hmm. Vielleicht kopiert sich die diag.exe sich selbst in die config.sys ohne eingestelle Interrupts?
Ein ähnliches Problem wurde hier bereits geschildert:
http://www.myvideo.de/watch/5497397/...Gequatsche_exe

( Sorry, ist jetzt vielleicht auch ein bisschen off-topic )

danu1104 8. Mär 2012 10:28

AW: TStringlist leert sich Selbst!
 
Lösung:

Da ich mehrere Listen nutze und dazu verschieden Delimiter Chars (' ' und '.') aber nur eine Quelle habe "CMD", kann die eine Liste mit dem Delimiter ('.') nichts anfangen und die andere mit Delimiter (' ') nicht.

Ich habe jetzt auf beide listen den gleichen Delimiter , und es funktioniert ohne fehler.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:23 Uhr.

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