Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Probleme mit Paramstr. und TStringlist (https://www.delphipraxis.net/79783-probleme-mit-paramstr-und-tstringlist.html)

R2D2 28. Okt 2006 10:40


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:
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.
Der registry-key sieht so aus:

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?

mkinzler 28. Okt 2006 10:44

Re: Quellcode funzt nicht
 
der Fehler dürfte hier liegen:
Delphi-Quellcode:
sl.LoadFromFile('.\data.list');
ersetze das mal durch
Delphi-Quellcode:
sl.LoadFromFile( ExtractFilePath( ParamStr(0))+.'\data.list');

Union 28. Okt 2006 10:56

Re: Quellcode funzt nicht
 
Du musst die Schleife ändern:
Delphi-Quellcode:
i := 0;
while i < sl.clount do
begin
   if sl[i] = '' then
      sl.delete[i]
   else
      inc(i);
end;
Denn duch das Delete wird ja Count um 1 dekrementiert.

mkinzler 28. Okt 2006 10:58

Re: Quellcode funzt nicht
 
Oder noch besser, bei deletes die Schleife immer vom Ende zum Anfang Laufen lassen!

TBx 28. Okt 2006 11:03

Re: Quellcode funzt nicht
 
Ein Fehler findet sich hier:
Delphi-Quellcode:
for i := 0 to sl.Count - 1 do if sl.Strings[i] = '' then sl.Delete(i);
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.
Sochle Schlefen immer rückwärts laufen lassen:
Delphi-Quellcode:
for i := sl.Count - 1 downto 0 do if sl.Strings[i] = '' then sl.Delete(i);
Gruß

onlinekater

[Trotz_roten_Kastens] Weil die Erklärung mit drin ist [/Trotz_roten_Kastens]

Union 28. Okt 2006 11:05

Re: Quellcode funzt nicht
 
Generell sollte man gar keine for Schleifen verwenden, wenn sich innerhalb des Blocks Anfangs- Endwert oder Zähler ändern.

TBx 28. Okt 2006 11:18

Re: Quellcode funzt nicht
 
Zitat:

Zitat von Union
Generell sollte man gar keine for Schleifen verwenden, wenn sich innerhalb des Blocks Anfangs- Endwert oder Zähler ändern.

Mal davon abgesehen, dass man das nicht so generell sagen kann (in diesem Fall ist eine abwärts zählende FOR-Schleife durchaus sinnvoll) hat Dein Code auch noch zwei Fehler:
Zitat:

while i < sl.clount do
  • soll sicherlich ...
    Delphi-Quellcode:
    sl.Count
    heißen
  • geht diese Routine in die Hose, wenn sl.count von Anfang an 0 ist --> es muss also zuvor zumindest überprüft werden, ob die Liste überhaupt Items enthält
    Wie Hawkee weiter untern ausführt, ist das falsch :wall:

Gruß

onlinekater

Hawkeye219 28. Okt 2006 11:40

Re: Quellcode funzt nicht
 
Hallo Thomas,

Zitat:

Zitat von onlinekater
[...]geht diese Routine in die Hose, wenn sl.count von Anfang an 0 ist --> es muss also zuvor zumindest überprüft werden, ob die Liste überhaupt Items enthält

WHILE startet eine abweisende Schleife. Für sl.Count = 0 wird der Schleifenkörper als nicht betreten.
Deine Ansicht zu FOR-Schleifen teile ich, sie sind meiner Meinung nach lesbarer.

Gruß Hawkeye

marabu 28. Okt 2006 11:41

Re: Quellcode funzt nicht
 
Hallo Lucas,

du fragst, was du besser machen kannst? Hier ein paar Vorschläge:

Delphi-Quellcode:
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.
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.

Grüße vom marabu

R2D2 28. Okt 2006 12:05

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:
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.
Jetzt sieht aber die data-list so aus:

Zitat:

C:\Programme\Mozilla
C:\Dokumente
C:\Dokumente
Sprich: Er hört bei jedem Leerzeichen auf.

[EDIT]Titel geändert. Hoffentlich aussagekräftiger :mrgreen:.[/EDIT]


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:38 Uhr.
Seite 1 von 2  1 2      

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