Autor Beitrag
hRb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 207
Erhaltene Danke: 12



BeitragVerfasst: Mi 19.02.20 11:52 
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6350
Erhaltene Danke: 137

Windows 7 + Windows 10
Tokyo Prof + CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 207
Erhaltene Danke: 12



BeitragVerfasst: 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):

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 207
Erhaltene Danke: 12



BeitragVerfasst: Mi 11.03.20 23:51 
Verschobene Frage ist gelöst.
Siehe unter Rubrik Graph.-Oberfläche Markierter Text in Richedit bearbeiten.

Moderiert von user profile iconTh69: URL hinzugefügt.