![]() |
Probleme mit Paramstr. und TStringlist
Hallo!
Ich will mit dem folgenden Consolen-Code eine Zeile zu einer Datei hinzufügen, und eventuelle leere Zeilen löschen. Der Code wird durch das Kontextmenü aufgerufen.
Delphi-Quellcode:
Der registry-key sieht so aus:
program add;
{$APPTYPE CONSOLE} uses SysUtils, Classes; var sl: TStringlist; i : Integer; begin sl := TStringlist.create; sl.LoadFromFile('.\data.list'); if sl.Count < 7 then sl.Add(Paramstr(1)); for i := 0 to sl.Count - 1 do if sl.Strings[i] = '' then sl.Delete(i); sl.SaveToFile('.\data.list'); sl.Free; writeln('Link created succesfully.'); end. HKEY_CLASSES_ROOT\*\Shell\Desktop-Manager\command (Standard) Typ: REG_SZ Wert: "C:\Dokumente und Einstellungen\Lucas\Eigene Dateien\Delphi\Manager\add.exe" %1 Mit einem rechtsklick auf eine Datei und den entsprechenden Eintrag im Kontextmenü bekomme ich aber einen Fehler: "Das Programm hat einen Fehler festgestellt und muss beendet werden." Warum? Wie kann ich das besser machen? |
Re: Quellcode funzt nicht
der Fehler dürfte hier liegen:
Delphi-Quellcode:
ersetze das mal durch
sl.LoadFromFile('.\data.list');
Delphi-Quellcode:
sl.LoadFromFile( ExtractFilePath( ParamStr(0))+.'\data.list');
|
Re: Quellcode funzt nicht
Du musst die Schleife ändern:
Delphi-Quellcode:
Denn duch das Delete wird ja Count um 1 dekrementiert.
i := 0;
while i < sl.clount do begin if sl[i] = '' then sl.delete[i] else inc(i); end; |
Re: Quellcode funzt nicht
Oder noch besser, bei deletes die Schleife immer vom Ende zum Anfang Laufen lassen!
|
Re: Quellcode funzt nicht
Ein Fehler findet sich hier:
Delphi-Quellcode:
Wenn irgendein Item außer dem (sl.Count - 1)ten leer ist, bekommst Du spätestens bei der Überprüfung des letzten Items eine Fehlermeldung, weil dieses Item nicht mehr existiert.
for i := 0 to sl.Count - 1 do if sl.Strings[i] = '' then sl.Delete(i);
Sochle Schlefen immer rückwärts laufen lassen:
Delphi-Quellcode:
Gruß
for i := sl.Count - 1 downto 0 do if sl.Strings[i] = '' then sl.Delete(i);
onlinekater [Trotz_roten_Kastens] Weil die Erklärung mit drin ist [/Trotz_roten_Kastens] |
Re: Quellcode funzt nicht
Generell sollte man gar keine for Schleifen verwenden, wenn sich innerhalb des Blocks Anfangs- Endwert oder Zähler ändern.
|
Re: Quellcode funzt nicht
Zitat:
Zitat:
Gruß onlinekater |
Re: Quellcode funzt nicht
Hallo Thomas,
Zitat:
Deine Ansicht zu FOR-Schleifen teile ich, sie sind meiner Meinung nach lesbarer. Gruß Hawkeye |
Re: Quellcode funzt nicht
Hallo Lucas,
du fragst, was du besser machen kannst? Hier ein paar Vorschläge:
Delphi-Quellcode:
Deine Datei liegt immer im Arbeitsverzeichnis deines Programms. Wer keine Leerzeilen schreibt, der muss sie später auch nicht raus löschen. Ohne ReadLn() hast du keine Chance deine Ausgaben wahrzunehmen. Bei Zugriffsproblemen innerhalb von LoadFromFile() oder SaveToFile() wird eine Exception geworfen, die noch nicht behandelt wird. Lass dir was dazu einfallen.
program add;
{$APPTYPE CONSOLE} uses SysUtils, Classes; const MAX_COUNT = 7; resourcestring S_FILENAME = 'data.list'; S_SUCCESS = 'Link created succesfully.'; S_PARAMCOUNT = 'Some Parameters ignored'; S_OVERFLOW = 'List overflow'; S_WAITING = 'Press enter to continue ...'; begin if ParamCount = 1 then with TStringlist.Create do try LoadFromFile(S_FILENAME); if sl.Count < MAX_COUNT then begin Add(Paramstr(1)); SaveToFile(S_FILENAME); WriteLn(S_SUCCESS); end else WriteLn(S_OVERFLOW); finally Free; end else WriteLn(S_PARAMCOUNT); WriteLn(S_WAITING); ReadLn; end. Grüße vom marabu |
Re: Quellcode funzt nicht
Marabu, irgendwie geht dein Prog überhaupt nicht.
Es lässt alle Parameter aus. Ich habe es jetzt mal geupdatet:
Delphi-Quellcode:
Jetzt sieht aber die data-list so aus:
program add;
{$APPTYPE CONSOLE} uses SysUtils, Classes; var sl: TStringlist; i : Integer; begin sl := TStringlist.create; sl.LoadFromFile(ExtractFilePath(ParamStr(0))+'\data.list'); if sl.Count < 7 then sl.Add(Paramstr(1)); for i := sl.Count - 1 downto 0 do if sl.Strings[i] = '' then sl.Delete(i); sl.SaveToFile(ExtractFilePath(ParamStr(0))+'\data.list'); sl.Free; writeln('Link created succesfully.'); end. Zitat:
[EDIT]Titel geändert. Hoffentlich aussagekräftiger :mrgreen:.[/EDIT] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 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