![]() |
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:
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.
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'); PS: Habe einen EStringlistError mit
Delphi-Quellcode:
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.try test() .... except On e : EStringlistError do // Else // end; |
AW: TStringlist leert sich Selbst!
Zitat:
|
AW: TStringlist leert sich Selbst!
Zitat:
![]() Zitat:
|
AW: TStringlist leert sich Selbst!
Hallo
Delphi-Quellcode:
//***--> kann beim letzten Element durch das +1 nicht gutgehen
for ic:=0 to varvalueex.Count -1 do
if VarValueex.Strings[ic] = str then Begin result:=Pchar(VarValueex.Strings[ic+1]); //*** Gruß Frank |
AW: TStringlist leert sich Selbst!
Hallo... ist der Quelltext aus #1 alles ? Zeige mal ein wenig mehr... Der Ausschnitt sagt gar nix.
|
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:
Und ich empfehle dir ganz dringend ein Tutorial über Pointer.
function getvarval(str:Pchar):Pchar;
begin result:=Pchar(VarValueex.Strings[ic+1]); end; 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? |
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'); |
AW: TStringlist leert sich Selbst!
Ich habe jetzt
Delphi-Quellcode:
entfernt , und das Resultat ist das die listen jetzt voll bleiben (juhuu) , doch habe ich den EStringlistError der mir die App immer crasht.
try
test() .... except On e : EStringlistError do end; 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 .... |
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. |
AW: TStringlist leert sich Selbst!
.. wo kommt denn diese Funktion zum Einsatz?
Delphi-Quellcode:
Ich würde die StringList auch als Parameter übergeben.
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;
Delphi-Quellcode:
Grüße
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; Klaus |
AW: TStringlist leert sich Selbst!
Zitat:
Die Lösung wurde im vierten Post in diesen Thread genannt. |
AW: TStringlist leert sich Selbst!
Zitat:
|
AW: TStringlist leert sich Selbst!
Zitat:
Wenn du nur über meiner Rechtschreibung dir deinen Kopf zerbrichst , dann lass mich bitte selber den fehler finden, und werde Deutsch Lehrer. |
AW: TStringlist leert sich Selbst!
Zitat:
Aus der Delphi-Hilfe: Zitat:
|
AW: TStringlist leert sich Selbst!
Zitat:
|
AW: TStringlist leert sich Selbst!
Zitat:
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:
script aus datei:
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; Zitat:
Und deswegen verstehe ich es nicht, das ist so übersichtlich, wie kann da solch ein fehler sein |
AW: TStringlist leert sich Selbst!
Zitat:
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 |
AW: TStringlist leert sich Selbst!
Zitat:
|
AW: TStringlist leert sich Selbst!
Zitat:
Solange er nicht mit Laufzeitpackages kompiliert, würde ich davon eher abraten, Objekte über RTTI-Grenzen hinweg zu übergeben. |
AW: TStringlist leert sich Selbst!
Zitat:
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: |
AW: TStringlist leert sich Selbst!
Zitat:
Grüße |
AW: TStringlist leert sich Selbst!
Zitat:
|
AW: TStringlist leert sich Selbst!
Zitat:
Naja Danke @ all , ich werde halt nochmal neu anfangen :-) |
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: ![]() ( Sorry, ist jetzt vielleicht auch ein bisschen off-topic ) |
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 15:05 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-2025 by Thomas Breitkreuz