Autor |
Beitrag |
D. Annies
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Mi 01.08.07 11:10
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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 01.08.07 11:37
Nicht zu vergessen, dass Strings bei 1 und nicht bei 0 anfangen.
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: 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]
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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.
_________________ Na denn, dann. Bis dann, denn.
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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: www.delphi-library.d...n+besteht_21567.html
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Mi 01.08.07 16:24
Danke - und die Umlaute muss ich noch ergänzen, richtig?
Gruß, Detlef
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: 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 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Do 02.08.07 19:48
Ok, Sebastian, hast gewonnen - leuchtet mir ein,
Gruß, Detlef
|
|
|