AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Einige nützliche Dateifunktionen

Ein Thema von Mattin · begonnen am 25. Nov 2003 · letzter Beitrag vom 26. Nov 2003
Antwort Antwort
Seite 2 von 2     12   
roderich
(Gast)

n/a Beiträge
 
#11

Re: Einige nützliche Dateifunktionen

  Alt 25. Nov 2003, 16:16
Luckie, deine beiden Routinen sind aber auch nicht das Gelbe vom Ei.

Delphi-Quellcode:
function HasBackslash(Dir: String): Boolean;
begin
  result := Dir[length(Dir)] = '\';
end;
Dir = Leerstring -> Knatsch !!


Delphi-Quellcode:
function DelBackSlash(Dir: String): String;
begin
  if length(dir) > 0 then
    SetLength(Result, Length(Result)-1);
end;
ok, kein Absturz, aber damit löscht du jedes Zeichen von hinten, nicht nur Slash'e


Roderich
  Mit Zitat antworten Zitat
Mattin

Registriert seit: 4. Sep 2003
72 Beiträge
 
Delphi 7 Professional
 
#12

Re: Einige nützliche Dateifunktionen

  Alt 25. Nov 2003, 16:18
[quote="sakura"]
Zitat von Mattin:
Ich muss dazu sagen, die Funktionen sind Uralt. Ich habe diese unter Delphi 1
damals geschrieben. War glaub ich 1992/3 oder so.
Delphi 1 kam Ende Sommer 1995 auf den Markt

Wusste nicht mehr genau wann Delphi raus kam.Schrieb ja schon vorsichtshalber oder so .

Zitat von Mattin:
Aber verschiedene Lösungsvorlschläge sind ja mal auch nicht schlecht. Oder ?
Nein, nie. Das ist auch wünschenswert Deswegen würde ich mich auch freuen, wenn Du am Ende alle Prozeduren nach Beheben der Mängel noch einmal vorstellst

Wenn ich Zeit dazu finde werde ich mir mal Prozeduren nochmal zu Brust nehmen. Kann aber ein weilchen Dauern.
Mit freundlichen Grüßen
Mattin

http://www.martin-karwoth.de
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#13

Re: Einige nützliche Dateifunktionen

  Alt 25. Nov 2003, 16:23
Zitat von roderich:
Luckie, deine beiden Routinen sind aber auch nicht das Gelbe vom Ei.
Habe ich auch nicht behauptet.
Zitat:
Delphi-Quellcode:
function HasBackslash(Dir: String): Boolean;
begin
  result := Dir[length(Dir)] = '\';
end;
Dir = Leerstring -> Knatsch !!
Stimmt, da habe ich die Überprügung, woie bei der zweiten.

Zitat:
Delphi-Quellcode:
function DelBackSlash(Dir: String): String;
begin
  if length(dir) > 0 then
    SetLength(Result, Length(Result)-1);
end;
ok, kein Absturz, aber damit löscht du jedes Zeichen von hinten, nicht nur Slash'e
Tja, da muss man vorher überprüfen, ob es auch einen '\' gibt. Kann man aber auch noch mit einbauen.

So verbessert:
Delphi-Quellcode:
////////////////////////////////////////////////////////////////////////////////
// Procedure : HasBackslash
// Comment : Checks whether path ends with a backslash or not

function HasBackslash(Dir: String): Boolean;
begin
  if length(Dir) > 0 then
   result := Dir[length(Dir)] = '\';
end;


////////////////////////////////////////////////////////////////////////////////
// Procedure : DelBackSlash
// Comment : Removes the last backslash of a path

function DelBackSlash(Dir: String): String;
begin
  if (length(dir) > 0) and (Dir[length(Dir)] = '\') then
    SetLength(Result, Length(Result)-1);
end;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#14

Re: Einige nützliche Dateifunktionen

  Alt 26. Nov 2003, 09:35
Zitat von Luckie:
Delphi-Quellcode:
function HasBackslash(Dir: String): Boolean;
//...

function DelBackSlash(Dir: String): String;
begin
  if (length(dir) > 0) and (Dir[length(Dir)] = '\') then
    SetLength(Result, Length(Result)-1);
end;
Hallo Luckie,

diese Funktion hast Du tatsächlich im Einsatz ("Ich habe mir mal in einem nonVCL Programm sowas dafür gemacht")?! Mal davon ab, dass der Funktionsname HasBackslash ebenfalls nicht sprechend ist (schließlich könnte er irgendeinen Backslash erkennen) und "Backslash" anders schreibt als in DelBackSlash, wo wird denn Result innerhalb von DelBackSlash gesetzt? Du prüfst einen Parameter und änderst daraufhin den Rückgabewert, der bisher nicht belegt worden ist, andernfalls wird der Rückgabewert nicht einmal angefasst...

Vielleicht so?
Delphi-Quellcode:
function GetWithoutTrailingBackslash(const ADirectory: string): string;
begin
  Result:= ADirectory;
  while HasTrailingBackslash(Result) do
    SetLength(Result, Length(Result)-1);
end;
Wenn der Ton etwas aggressiv klingen sollte, liegt das vielleicht daran, dass ich gerade auf der Arbeitsplatte wg einer defekten Kaffeekanne die Dispersionseigenschaften selbigen Inhalts beobachten könnte...
gruß, choose
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#15

Re: Einige nützliche Dateifunktionen

  Alt 26. Nov 2003, 16:09
[quote="choose"] Mal davon ab, dass der Funktionsname HasBackslash ebenfalls nicht sprechend ist (schließlich könnte er irgendeinen Backslash erkennen)´
[quote]
Er sit aussagekräftig, da sich die Funktion in einer Include-Datei namens FileTools befindet. Um was soll es also anderes gehen, als um Pfade?
Zitat:
und "Backslash" anders schreibt als in DelBackSlash,
Tippfehler. Sollte aber keine Katastrophe heraufbeschwören.
Zitat:
wo wird denn Result innerhalb von DelBackSlash gesetzt?
In setlength, wo sonst?
Zitat:
Du prüfst einen Parameter und änderst daraufhin den Rückgabewert, der bisher nicht belegt worden ist, andernfalls wird der Rückgabewert nicht einmal angefasst...
Hm, das könnte in der Tat ein Problem sein. Aber die modifizierte Fassung hab eich nich nicht benutzt.
Zitat:
Vielleicht so?
Delphi-Quellcode:
function GetWithoutTrailingBackslash(const ADirectory: string): string;
begin
  Result:= ADirectory;
  while HasTrailingBackslash(Result) do
    SetLength(Result, Length(Result)-1);
end;
Nein so bestimmt nicht. Der Funktionsname ist ja ein halber Roman und was ist HasTrailingBackSlash? Eine Funktion? Nicht sehr gut, die wird ja jedes mal auf gerufen, so lange die Schleife läuft.
Wenn dann so:
Delphi-Quellcode:
function DelBackSlash(Dir: String): String;
begin
  result := Dir;
  if (length(dir) > 0) and (Dir[length(Dir)] = '\') then
    SetLength(Result, Length(Result)-1);
end;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#16

Re: Einige nützliche Dateifunktionen

  Alt 26. Nov 2003, 17:13
Ich will auch mal, , denn wenn ich irgendeinen Wert an "Result" übergebe, dann benutze ich auch "Result" zum Testen. Ansonsten könnte man auch die Variable im Funktionskopf bearbeiten und dann an das Funktionsergebnis weiterreichen. Geht hier aber nicht, weil es eine Konstante ist. Absichtlich! Dann kommt man nämlich gar nicht erst in Versuchung, den Wert direkt bearbeiten zu wollen.
Delphi-Quellcode:
function DelBackslash(const Dir: string): string;
begin
  Result := Dir;

  if(Result <> '') then
    while(Result[length(Result)] = '\') do
      SetLength(Result,length(Result)-1);
end;
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#17

Re: Einige nützliche Dateifunktionen

  Alt 26. Nov 2003, 17:48
Zitat von Luckie:
Zitat von choose:
Mal davon ab, dass der Funktionsname HasBackslash ebenfalls nicht sprechend ist (schließlich könnte er irgendeinen Backslash erkennen)
Zitat:
Er sit aussagekräftig, da sich die Funktion in einer Include-Datei namens FileTools befindet. Um was soll es also anderes gehen, als um Pfade?
Dieser String "c:\foo\bar\foobar" enthält drei Backslashes, ich erwarte, dass der Rückgabewert einer Funktion HasBackslash den Wert True enthält.
Zitat von Luckie:
Hm, das könnte in der Tat ein Problem sein. Aber die modifizierte Fassung hab eich nich nicht benutzt.
funktioniert sie nun, oder nicht?

Zitat von Luckie:
[...]und was ist HasTrailingBackSlash? Eine Funktion? Nicht sehr gut, die wird ja jedes mal auf gerufen, so lange die Schleife läuft.
Wenn dann so:
Delphi-Quellcode:
function DelBackSlash(Dir: String): String;
begin
  result := Dir;
  if (length(dir) > 0) and (Dir[length(Dir)] = '\') then
    SetLength(Result, Length(Result)-1);
end;
Genau genommen wird sie im Idealfall genau einmal aufgerufen und mach die selben Tests wie die direkte Implementierung (short-circuit). Der Aufruf der Funktion ist daher kaum "teurer", verdeutlicht hingegen aber die Intention, ohne dass die Statements verstanden werden müssen.
Eine Schleife habe ich nur für den unwahrschienlichen Fall, dass der Inhalb des Strings etwas in dieser Form ist "c:\foo\\". Unter diesen Umständen würde die Implementierung mit if trotzdem einen Backslash am Ende hinterlassen...

[edit]zu den mitromanenvergleichbaren Bezeichnern: Auch hier wird durch DelBackslash nicht klar, welcher Backslash nun gelöscht wird, bzw. ob im Fall "c:\\" beide gelöscht werden, tatsächlich setzt sich der Bezeichner GetWithoutTrailingBackslash aus mehr Zeichen zusammen, enthält aber auch mehr information:
  • Es wird nicht der Parameter verändert, wie der gekürzte Imparativ "Delete" suggeriert (siehe auch System.Delete)
  • Die Funktion betrachtete ausschließlich die Backslashes am Ende des Strings
  • Die Funktion gibt einen String zurück, der keinen der betrachteten Backslashes mehr enthält (also ist auch der Fall mit mehreren Backslashes geklärt)
[/edit]
gruß, choose
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 19:20 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