Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Teilstring löschen?


D. Annies - Mi 01.08.07 11:10
Titel: Teilstring löschen?
Hi, Delpher,

ich möchte aus einem String, vom Anfang (= 0) bis zum Auftreffen eines Doppelpunktes diese ersten Zeichen incl Doppelpunkt löschen.
fname ist string; fkurzname ist string[27], da Excel nur Dateinamen mit max 31 Zeichen verarbeiten kann. Also plus Endung '.xls' = 31 Zeichen.

Mein Versuch:


Delphi-Quelltext
1:
2:
3:
fkurzname := delete(listbox2.items[listbox2.itemindex], 0,
                                   pos(':', listbox2.items[listbox2.itemindex]));
                    fname := fkurzname + '.xls';


Die Fehlermeldung ist: zu viele Parameter.

Wer kann da helfen?
Danke, Detlef


jaenicke - Mi 01.08.07 11:31

Delete löscht direkt im String, d.h. du musst eine Variable (listbox2.items[listbox2.itemindex] ist ja eine Eigenschaft) übergeben. Das Ergebnis steht dann direkt da drin und wird nicht zurückgegeben.


jasocul - Mi 01.08.07 11:37

Nicht zu vergessen, dass Strings bei 1 und nicht bei 0 anfangen.


Lannes - Mi 01.08.07 11:54

Hallo,

anstelle von Delete würde ich Copy verwenden, denn man kann in dem Fall ab ':' bis Ende den String herrauskopieren, und es ist keine zusätzliche Variable erforderlich.

[OT]Worauf beruht Deine Angabe der maximalen Dateinamenlänge in EXCEL. In welchem Zusammenhang gibt es denn da Probleme?
Ich konnte bisher diesbezgl. noch nichts feststellen.[/OT]


alzaimar - Mi 01.08.07 13:18

So eine grundlegende Funktionalität sollte eine allgemeingültige Funktion/Prozedur/Methode bekommen. Ich habe eine Routine, die einen String an einem Trennstring in zwei Teile zerlegt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
Function Split (Var S: String; Del: String): String;
Var
  p: Integer;

Begin
  p := pos(Del, S);
  If p = 0 Then Begin
    Result := s;
    s := '';
  End
  Else Begin
    Result := Copy(s, 1, p - 1);
    s := Copy(s, p + length(Del), length(s));
  End;
End;
...

  MyString := 'abcdef:ghijkl';
  MyFirstString := split (MyString,':');
// MyString = 'ghijkl' und MyFirstString = 'abcdef';

Hier würde also ein Aufruf von

Delphi-Quelltext
1:
  Split (MeinString,':')                    

genügen.

Meine Lösung funktioniert auch, falls kein ':' im String vorkommt.


jaenicke - Mi 01.08.07 13:24

Wenn man nicht nur zwei Teile hat, dann kann man das ja auch einfach an eine Stringlist geben, die per Delimiter / DelimitedText automatisch den String teilt und dann in der Liste die einzelnen Teile enthält.


D. Annies - Mi 01.08.07 14:37

Hallo, ihr alle,

mit so einer großen und schnellen Resonanz habe ich ja gar nicht gerechnet - vielen Dank dafür.

ich habe jetzt entsprechend geändert mit delete.

Ffrage: Gibt es eine Funktion oder Routine, mit der ich für Excel unerlaubte Zeichen im Dateinamen sozusagen komplett rauslöschen kann - oder muss ich den String wieder einzeln "durchklappern"?

Ach so, die Beschränkung auf 31 Zeichen gilt für den worksheet-Namen von ExQuäl;

Gruß, Detlef


jaenicke - Mi 01.08.07 16:08

Die Zeichen sind ja nicht nur bei Excel nicht erlaubt, die Sonderzeichen darf man ja von Windows her schon nicht einsetzen.
Mach es einfach so wie hier, nur dass du statt nur zu prüfen das Zeichen mit Delete löschst:
http://www.delphi-library.de/topic_pruefen+ob+der+Dateiname+aus+gueltigen+Zeichen+besteht_21567.html


D. Annies - Mi 01.08.07 16:24

Danke - und die Umlaute muss ich noch ergänzen, richtig?

Gruß, Detlef


jaenicke - Mi 01.08.07 16:29

Seit wann gehen die nicht? Ich meine die können in Dateinamen normalerweise ja vorkommen, bei Excel eigentlich auch. Ist das eine alte Version von Excel?


D. Annies - Mi 01.08.07 21:23

Hi, Sebastian,

ich glaube, das gilt auch wieder für den Worksheetnamen - muss noch mal genau die Fehlermeldung provozieren und ansehen, dort sind die nicht erlaubten Zeichen aufgeführt ...

ansonsten, guter Tipp, der kleine Minicode!

Vielen Dank,
Detlef aus Lübeck


D. Annies - Do 02.08.07 13:57

S,

ein kleiner Nachklapp mit der Lösung, die ich jetzt einsetze:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function MakeValidName(const Name: String): Boolean;
var k: Byte;
begin              // if Length(FileName) > 255 then Exit;
  for k := 1 to Length(Name) do
    if Name[k] in ['/','\',':','*','"','?','<','>','|'then
    begin
      fkurzname := stringreplace(name, name[k], '_', [rfreplaceall, rfignorecase]);
      showmessage('neuer Name:  ' + fkurzname);
    end;  
  result := true;
end;


Vielen Dank für die Tipps,
Detlef


jaenicke - Do 02.08.07 14:01

Das ist aber recht ineffizient, wie wäre es so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function MakeValidName(const Name: String): Boolean;
var k: Byte;
begin              // if Length(FileName) > 255 then Exit;
  fkurzname := Name;
  for k := 1 to Length(Name) do
    if Name[k] in ['/','\',':','*','"','?','<','>','|'then
    begin
      fkurzname[k] := '_';
      showmessage('neuer Name:  ' + fkurzname);
    end
    else
      fkurzname[k] := Name[k];
  result := true;
end;

// EDIT:
Habe den Quelltext nochmal verändert.
// EDIT 2:
Ach so: Und wenn du den String als var übergibst, dann wird der übergebene String direkt verändert. Mit globalen Variablen finde ich solche Funktionen immer ein wenig unsauber, aber das ist nur meine persönliche Meinung...


D. Annies - Do 02.08.07 19:48

Ok, Sebastian, hast gewonnen - leuchtet mir ein,

Gruß, Detlef