Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi String intelligent Kürzen (https://www.delphipraxis.net/161132-string-intelligent-kuerzen.html)

mkinzler 19. Jun 2011 10:28

AW: String intelligent Kürzen
 
Übernehme den Teil aus meiner Version

BBoy 19. Jun 2011 12:22

AW: String intelligent Kürzen
 
Cool, das funktioniert sogar :)

Nur damit ich es auch verstehe, zu was ist eigentlich der Record US da?

Nochmal vieeeeelen Dank an euch zwei!! Die Funktion macht nun genau das was sie soll und das sogar besser als erwartet :-D

himitsu 19. Jun 2011 13:09

AW: String intelligent Kürzen
 
Das ist eine Bitmaske, wenn ein Name schon vorhanden ist, dann werden über diese Maske, beim nächsten Durchgang, Löschaktionen übersprungen, so daß ein anderer Name entsteht.

Obwohl noch ein
Delphi-Quellcode:
i := Length(S);
bei
Delphi-Quellcode:
// ungültige Zahlen entfernen
fehlt, sollte dennoch die Zahl erhalten bleiben, da das Ganze ohne mit 0 initialisiert würde (durch die vorherige For-Schleife) :gruebel:

[edit]
ah, hatte hier nur eine zweistellige Zahl drin, wlche erfolgreich durchkam :wall:

Delphi-Quellcode:
type TKueDatErlaubt = function(S: String): Boolean;

function KuerzeDateiname(S: String; Len: Integer; Erlaubt: TKueDatErlaubt): String;
var
  i, i2, u: Integer;
  SL: TStrings;
  US: record
    case Integer of
      0: (i: Int64);
      1: (s: Set of 0..63);
  end;
begin
  // ungültige Zeichen entfernen
  for i := Length(S) downto 1 do
    if not (S[i] in [' ', 'a'..'z', 'A'..'Z', '0'..'9']) then
      Delete(S, i, 1);
  // ungültige Zahlen entfernen
  i := Length(S);
  while (i > 0) and (S[i] in ['0'..'9']) do
    Dec(i);
  for i := i downto 1 do
    if (S[i] in ['0'..'9']) then
      Delete(S, i, 1);
  //
  SL := TStringList.Create;
  try
    US.s := [];
    repeat
      U := 0;
      // String aufsplitten
      SL.LineBreak := '';
      SL.Delimiter := ' ';
      SL.StrictDelimiter := True;
      SL.DelimitedText := S;
      // längstes Wort suchen + Capitalize
      i2 := 0;
      for i := SL.Count -1 downto 0 do begin
        SL[i] := UpperCase(Copy(SL[i], 1, 1)) + LowerCase(Copy(SL[i], 2));
        i2 := Max(i2, Length(SL[i]));
      end;
      // Anzahl der zu entfernenden Zeichen
      Len := Length(SL.Text) - Len;
      // kurze Wörter (Einzelbuchstaben) entfernen
      i := SL.Count - 1;
      while (Len > 0) and (i >= 0) do begin
        if (Length(SL[i]) = 1) and (SL[i][1] in ['a'..'z', 'A'..'Z']) then begin
          if not (U in US.s) then begin
            SL.Delete(i);
            Dec(Len);
          end;
          Inc(U);
        end;
        Dec(i);
      end;
      // Wörter kürzen
      i := -1;
      while (Len > 0) do begin
        if i < 0 then begin
          i := SL.Count - 1;
          Dec(i2);
        end;
        if Length(SL[i]) > i2 then begin
          if not (U in US.s) then begin
            SL[i] := Copy(SL[i], 1, i2) + Copy(SL[i], i2 + 2);
            Dec(Len);
          end;
          Inc(U);
        end;
        Dec(i);
      end;
      // nächstes Set, für's Überspringen
      Inc(US.i);
      // Text zusammensetzen und ausgeben
      Result := SL.Text;
    until Erlaubt(Result);
  finally
    SL.Free;
  end;
end;
Dürfen die Zahlen eigentlich ebenfalls gekürzt werden?
Längere Zahlen werden es ja aktuell noch.

sx2008 19. Jun 2011 13:51

AW: String intelligent Kürzen
 
Die gestellte Aufgabe ist definitiv ein Job für eine Klasse.
Damit ist es viel einfacher jede Teilaufgabe in einer eigenen Methode zu lösen.
Zudem kann eine Klasse übergreifend benötigte Informationen wie z.B. MaxTotalLen=14, Anzahl der Wörter,
die Zahl am Ende einfach in privaten Feldern speichern.
Die einzelnen Methoden werden kleiner und leichter zu testen, als wenn man Alles in einer einzigen grossen Funktion verarbeitet.

Und überhaupt ist hier das Testen unbedingt nötig.
Man braucht also ein Testbett mit dem man mehrere Wertepaare aus Ein- und Ausgangswerten automatisch überprüfen kann.

mkinzler 19. Jun 2011 14:13

AW: String intelligent Kürzen
 
Der TE war schon mit dem Verständnis meiner Minimallösung überfordert. Imho sollten wir nicht versuchen, eine optimale Lösung zu finden, sondern eine bei der er die Chance hat dise verstehen. In letzter Zeit entsteht aber die Tendenz eine Lösung zu finden, welche den Fragesteller auf jeden Fall überfordert.

BBoy 20. Jun 2011 12:23

AW: String intelligent Kürzen
 
Wie gesagt, bin sehr zufrieden mit der Mischung aus beiden Versionen. Funktioniert 1A und nach einigem grübeln und Studieren habe ich den Code auch verstanden. Also alles bestens. Danke. Habe nun schon hunderte Bezeichnungen auf diese Art gekürzt und es war immer gut. Notfalls könnte ich auch von Hand nach editieren wenn es mal nicht passen sollte.

Zahlen kommen nur selten vor. wenn dann extrem selten höchstens 3 stellig. Wenn überhaupt, dann meist 1-2stellig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:42 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz