Enumeratoren

Zur Vorstellung von Komponenten und Units für Lazarus
Antworten
Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Enumeratoren

Beitrag von theo »

Ein bisschen mit Enumeratoren spielen.

Dabei bin ich gleich beim Thema geblieben. Hier ein UTF8-Enumerator für AnsiString.
http://www.theo.ch/lazarus/enumerator.zip

Anwenden tut man's z.B. so:

Code: Alles auswählen

var s:AnsiString;
u8:TUTF8Char;
begin
  s:='aäuüoö';
  for u8 in UTF8Enum(s) do writeln(u8);             
end;

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Enumeratoren

Beitrag von marcov »

#o ist legal in Pascal Strings.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Enumeratoren

Beitrag von theo »

marcov hat geschrieben:#o ist legal in Pascal Strings.


Du meinst #0 oder?
Wegen der Abbruchbedingung beim PChar?
Das braucht den UTF8Enumerator afaik nicht kümmern.

One of the really nice features of UTF-8 is that it is compatible with nul-terminated strings. No character will have a nul (0) byte when encoded.

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Enumeratoren

Beitrag von marcov »

theo hat geschrieben:
marcov hat geschrieben:#o ist legal in Pascal Strings.


Du meinst #0 oder?


Ja.

Wegen der Abbruchbedingung beim PChar?
Das braucht den UTF8Enumerator afaik nicht kümmern.

One of the really nice features of UTF-8 is that it is compatible with nul-terminated strings. No character will have a nul (0) byte when encoded.


Das ist etwas anders. Das heißt wenn man eine >#127 Werte zerbricht, das da kein #0's raus kommen. Es meint nicht das es überhaupt keine #0's drin sein können. Nur der Enkodungsprozess macht keine neue.

Aber Unicode Codepoint 0 wird noch immer als ein einziges #0 Byte kodiert, und ist eine legalen Wert in Pascal (und Unicode) Strings.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Enumeratoren

Beitrag von theo »

Theoretisch hast du recht. Praktisch ist es vielleicht für den Enumerator nicht so bedeutsam.
Caption:='öäü'+#0+'öäü';
zeigt auch nur bis zum #0 an.
Man müsste dann einen extra Counter mitlaufen lassen, oder?

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Enumeratoren

Beitrag von marcov »

theo hat geschrieben:Theoretisch hast du recht. Praktisch ist es vielleicht für den Enumerator nicht so bedeutsam.
Caption:='öäü'+#0+'öäü';
zeigt auch nur bis zum #0 an.


Das ist glaube ich widgetset abhängig. Aber #0 ist nicht printbar, also das ist Logisch. Aber nicht alle Strings werden für UI genutzt.

Man müsste dann einen extra Counter mitlaufen lassen, oder?


Ja. Oder den Pointer zum ende (pend:=@p[length)) kalkulieren, und damit vergleichen. Das ist etwas günstiger.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Enumeratoren

Beitrag von theo »

marcov hat geschrieben:Ja. Oder den Pointer zum ende (pend:=@p[length)) kalkulieren, und damit vergleichen. Das ist etwas günstiger.


OK, ich habe das geändert. (gleicher Link oben).
Ist nicht merklich langsamer.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Enumeratoren

Beitrag von mschnell »

theo hat geschrieben:http://www.theo.ch/lazarus/enumerator.zip

Schau ich mir an, sobald ich kann...
Danke !
-Michael

Antworten