![]() |
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] |
Re: Quellcode funzt nicht
Ändere doch bitte mal den Titel. 99% der Fragen könnten unter diesem gestellt werden :roll:
...:cat:... |
Re: Quellcode funzt nicht
Zitat:
Hilfsweise kannst Du Dir hier einen String aus den Parametern 1 bis Paramcount - 1 zusammenbauen. Hope it helps Onlinekater |
Re: Probleme mit Paramstr. und TStringlist
Oder die eigentlichen Paramter in "" einschließen.
|
Re: Probleme mit Paramstr. und TStringlist
Hallo Lucas,
Markus hat es schon geschrieben - du musst den Standard-Eintrag in der Registrierdatenbank ändern:
Code:
Schade, dass du die vielen Hinweise in meinem Beispiel-Code noch nicht erkannt hast.
[HKEY_CLASSES_ROOT\Unknown\shell\Desktop-Manager\command]
@="C:\Dokumente und Einstellungen\Lucas\Eigene Dateien\Delphi\Manager\add.exe" "%1" Freundliche Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:46 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