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,':'); |
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
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 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 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!