Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Text konvertieren


hRb - Mi 19.02.20 11:52
Titel: Text konvertieren
Hallo zusammen,
Es gibt in Delphi einige Standard-Text-Konvertierungen, wie upper- und lowercase.
Ich möchte jedoch einen Text derart konvertieren, dass jeder kleine Buchstabe groß und jeder große Buchstabe klein wird. Dabei sollte die gesamte ANSI-Tabelle berücksichtigt werden - also auch Umlaute.
1. Habe ich eine Standardfunktion in Delphi 10 übersehen die das leistet?
2. Könnte Funktion CharInSet nutzen. Gibt es etwas "eleganteres"?
3. Hinweis: sollte bei AnsiString, wie auch bei String (UTF8, UTF16) funktionieren.
Danke für Tipps hRb


Moderiert von user profile iconNarses: Topic aus Grafische Benutzeroberflächen (VCL & FireMonkey) verschoben am Mi 19.02.2020 um 12:52


jasocul - Mi 19.02.20 12:06

Eine Standardfunktion ist mir nicht bekannt.

Ich würde den Text zwei mal verwalten.
Einmal das Original und einmal der Arbeitstext.

Im Arbeitstext würde ich pauschal alles in eine Richtung umwandeln. Idealerweise das, was häufiger vorkommt.
Danach würde ich die beiden Texte zeichenweise vergleichen und wenn die Zeichen gleich sind, die entsprechend andere Umwandlung für das jeweilige Zeichen machen.


hRb - Mi 19.02.20 17:59

Ok, ist aber extrem rechenintensiv.
ich hab's mal "klassisch" realisiert an Hand der ANSI-Tabelle (bis andere Vorschläge kommen):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var ChaNr : integer;
    SelLg : longint; //enthält Lg markierter Text
    sM    : String;  //enthält markierten Text
for j:=1 to SelLg do 
  begin
    ChaNr:=ord(sM[j]);
    if ChaNr>64 then begin                    //unter 65 bleibt unverändert
      if (ChaNr<=90then inc(ChaNr,32)       //A..Z wird a..z
      else if (ChaNr<97then
      else if (ChaNr<=122then dec(ChaNr,32//a..z wird A..Z
      else if (ChaNr<192then                //unverändert,ebenso mal,div am Num-Block
      else if (ChaNr<=222and not (ChaNr=215then inc(ChaNr,32)
      else if (ChaNr<=254and not (ChaNr=215and not (ChaNr=247then dec(ChaNr,32);
      sM[j]:= chr(ord(ChaNr));
    end;
  end;

Funktioniert. Allerdings stoße ich nun auf ein neues Problem, da mein Text in einem Richedit steht.
Da jedoch unerwünscht ist Folgefragen zu verknüpfen, stelle ich eine neue Frage ins Netz unter: "markierter Text in Richedit bearbeiten"
Gruß hRb


hRb - Mi 11.03.20 23:51

Verschobene Frage ist gelöst.
Siehe unter Rubrik Graph.-Oberfläche Markierter Text in Richedit bearbeiten [https://entwickler-ecke.de/viewtopic.php?t=118050.html].

Moderiert von user profile iconTh69: URL hinzugefügt.