AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Probleme mit Paramstr. und TStringlist
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit Paramstr. und TStringlist

Ein Thema von R2D2 · begonnen am 28. Okt 2006 · letzter Beitrag vom 28. Okt 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von R2D2
R2D2

Registriert seit: 20. Jan 2006
Ort: München
253 Beiträge
 
Delphi 2005 Personal
 
#1

Probleme mit Paramstr. und TStringlist

  Alt 28. Okt 2006, 10:40
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?
if then then then = else else else = then;

Meine Webseite
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Quellcode funzt nicht

  Alt 28. Okt 2006, 10:44
der Fehler dürfte hier liegen:
sl.LoadFromFile('.\data.list'); ersetze das mal durch
sl.LoadFromFile( ExtractFilePath( ParamStr(0))+.'\data.list');
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Quellcode funzt nicht

  Alt 28. Okt 2006, 10:56
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Quellcode funzt nicht

  Alt 28. Okt 2006, 10:58
Oder noch besser, bei deletes die Schleife immer vom Ende zum Anfang Laufen lassen!
Markus Kinzler
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.875 Beiträge
 
Delphi 12 Athens
 
#5

Re: Quellcode funzt nicht

  Alt 28. Okt 2006, 11:03
Ein Fehler findet sich hier:
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:
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]
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Quellcode funzt nicht

  Alt 28. Okt 2006, 11:05
Generell sollte man gar keine for Schleifen verwenden, wenn sich innerhalb des Blocks Anfangs- Endwert oder Zähler ändern.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.875 Beiträge
 
Delphi 12 Athens
 
#7

Re: Quellcode funzt nicht

  Alt 28. Okt 2006, 11:18
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 ... 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

Gruß

onlinekater
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Quellcode funzt nicht

  Alt 28. Okt 2006, 11:40
Hallo Thomas,

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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Quellcode funzt nicht

  Alt 28. Okt 2006, 11:41
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
  Mit Zitat antworten Zitat
Benutzerbild von R2D2
R2D2

Registriert seit: 20. Jan 2006
Ort: München
253 Beiträge
 
Delphi 2005 Personal
 
#10

Re: Quellcode funzt nicht

  Alt 28. Okt 2006, 12:05
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 .[/EDIT]
if then then then = else else else = then;

Meine Webseite
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 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