Besonders das hier
Code: Alles auswählen
//Mit Case "Buchstaben" ersetzen
for i:=1 to s.length do
case s[i] of
'o','ö': s[i]:='@';
end;
Code: Alles auswählen
//Mit Case "Buchstaben" ersetzen
for i:=1 to s.length do
case s[i] of
'o','ö': s[i]:='@';
end;
Laut wp_xyz hat sich bzgl. UTF8 Char "Handling" nichts vereinfacht. K.A.af0815 hat geschrieben: BTW: Wie geht das Beispiel (und die anderen von Theo) eigentlich mit den aktuellen 'irgendwas'-Strings ?
Ja, das würde vermutlich das Arbeiten mit Strings sehr erleichtern. Und diverse Fragen in den Foren nicht aufkommen lassen.af0815 hat geschrieben:Ich glaube die Lösung von Theo ist für mich die richtige.
Ich glaube zwar, die Frage ist eher rhetorisch, dass es ähnlich funktionieren kann, habe ich eben getestet:af0815 hat geschrieben:Besonders das hierBTW: Wie geht das Beispiel (und die anderen von Theo) eigentlich mit den aktuellen 'irgendwas'-Strings ?Code: Alles auswählen
//Mit Case "Buchstaben" ersetzen for i:=1 to s.length do case s[i] of 'o','ö': s[i]:='@'; end;
Code: Alles auswählen
uses ..., LazUTF8;
procedure TForm1.Button1Click(Sender: TObject);
var
s: String;
i: Integer;
begin
s := 'Möchte Möhre ohne ö';
for i := 1 to UTF8Length(s) do
case UTF8Copy(s, i, 1) of
'o', 'ö':
begin
UTF8Delete(s, i, 1);
UTF8Insert('@', s, i);
end;
end;
Caption := s;
end;
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Nein, das habe ich nicht.Michl hat geschrieben:@theo: hast du denn mal probiert deinen Code bei FPC oder Lazarus zu bewerben und ihnen zur Verfügung zu stellen? Ich fände es auf jeden Fall eine Bereicherung!!!
Das klingt doch sehr gut!!! Möchtest du deinen Code Lazarus zur Verfügung stellen oder siehst du eher keinen Bedarf? Ich meine die Entwickler von Lazarus scheinen mir sehr offen für neue gute Ansätze, besonders wenn sie mit dem aktuellen FPC umsetzbar sind.theo hat geschrieben:@Michl: Klar geht das irgendwie.
Die Frage war aber wahrscheinlich, ob das mit Bordmitteln jetzt elegant, performant und ohne Kopfzerbrechen geht.
Und wenn niemand eine bessere Lösung hat, muss man das wohl verneinen.
Das Problem bei diesen Fkt. ist, dass sie kein Gedächtnis haben.
Die Positionen müssen immer wieder vom String Anfang her gesucht werden, bei jedem einzelnen Funktionsaufruf!
TUniString springt nur immer zum nächsten Codepoint.
Außerdem ersetzt TUniString tatsächlich wenn möglich nur die entsprechenden Bytes und macht kein aufwändiges Löschen und Einfügen.
Nein, das habe ich nicht.Michl hat geschrieben:@theo: hast du denn mal probiert deinen Code bei FPC oder Lazarus zu bewerben und ihnen zur Verfügung zu stellen? Ich fände es auf jeden Fall eine Bereicherung!!!
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Dieser Code steht ja schon seit Jahren zur Verfügung.Michl hat geschrieben: Das klingt doch sehr gut!!! Möchtest du deinen Code Lazarus zur Verfügung stellen oder siehst du eher keinen Bedarf? Ich meine die Entwickler von Lazarus scheinen mir sehr offen für neue gute Ansätze, besonders wenn sie mit dem aktuellen FPC umsetzbar sind.
Ich habe ja auch versucht, da etwas anzustoßen, aber die propagieren die Delphi-XE voll-Kompatibilität (statt einer "abwärts"-Kompatibilität die die internen Mechanismen ändert, aber Delphi Code trotzdem in nahezu 100% der Fälle ohne Änderung portieren kann).theo hat geschrieben:Bis jetzt hat niemand von den Lazarus Entwicklern danach gefragt.
Ja, ist schon klar, dass TUniString für FPC/Lazarus nicht der Königsweg sein kann.mschnell hat geschrieben:Ich habe ja auch versucht, da etwas anzustoßen, aber die propagieren die Delphi-XE voll-Kompatibilität (statt einer "abwärts"-Kompatibilität die die internen Mechanismen ändert, aber Delphi Code trotzdem in nahezu 100% der Fälle ohne Änderung portieren kann).theo hat geschrieben:Bis jetzt hat niemand von den Lazarus Entwicklern danach gefragt.
Und da ist eben kein Platz für alternative Ansätze, sei es nun im internen Ablauf, oder in den Empfehlungen wie die User programmieren sollen .
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var
s: String;
i: Integer;
begin
s := 'Möchte Möhre ohne ö';
for i := 1 to s.Length do
case s.Chars[i] of
'o', 'ö': s.Chars[i] := '@';
end;
Caption := s;
end;
Code: Alles auswählen
{$modeswitch typehelpers}
...
type
TStringHelper = type helper for string
private
function GetChars(Index: Integer): TUTF8Char;
procedure PutChars(Index: Integer; aUTF8Char: TUTF8Char);
function GetLength: Integer;
public
property Chars[Index: Integer]: TUTF8Char read GetChars write PutChars;
property Length: Integer read GetLength;
end;
...
function TStringHelper.GetLength: Integer;
begin
Result := UTF8Length(Self);
end;
function TStringHelper.GetChars(Index: Integer): TUTF8Char;
begin
Result := UTF8Copy(Self, Index, 1);
end;
procedure TStringHelper.PutChars(Index: Integer;
aUTF8Char: TUTF8Char);
begin
UTF8Delete(Self, Index, 1);
UTF8Insert(aUTF8Char, Self, Index);
end;
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;