Autor Beitrag
D. Annies
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 01.08.07 11:37 
Nicht zu vergessen, dass Strings bei 1 und nicht bei 0 anfangen.
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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:
ausblenden 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
ausblenden Delphi-Quelltext
1:
  Split (MeinString,':')					

genügen.

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

_________________
Na denn, dann. Bis dann, denn.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Mi 01.08.07 16:24 
Danke - und die Umlaute muss ich noch ergänzen, richtig?

Gruß, Detlef
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Do 02.08.07 13:57 
S,

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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 02.08.07 14:01 
Das ist aber recht ineffizient, wie wäre es so:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Do 02.08.07 19:48 
Ok, Sebastian, hast gewonnen - leuchtet mir ein,

Gruß, Detlef