Rund um die LCL und andere Komponenten
Mathias
Beiträge: 7317 Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz
Beitrag
von Mathias » Mi 22. Apr 2015, 20:26
Ich will den kompletten ASCII-Code ausgeben.
Die Zeichen zwischen 128 und 256 kommen nicht.
Code: Alles auswählen
procedure TForm1.FormPaint(Sender: TObject);
var
i: byte;
begin
with Canvas.Font do begin
Charset := OEM_CHARSET;
Color := 0;
Height := 0;
Name := 'Terminal';
Pitch := fpDefault;
Size := 16;
Style := [fsBold, fsItalic, fsUnderline, fsStrikeOut];
Style := [];
end;
for i := 1 to 255 do begin
Canvas.TextOut((i - 0) * 10, 10, char(i));
end;
end;
ich habe noch folgendes probiert, geht aber auch nicht.
Unter Delphi kommen alle 256 Zeichen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Michl
Beiträge: 2513 Registriert: Di 19. Jun 2012, 12:54
Beitrag
von Michl » Mi 22. Apr 2015, 20:34
Hast du schon mal
Code: Alles auswählen
Canvas.TextOut((i - 0) * 10, 10, UTF8Encode(char(i)));probiert?
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Mathias
Beiträge: 7317 Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz
Beitrag
von Mathias » Mi 22. Apr 2015, 20:45
Habe es gerade probiert, kommt leider ein Kompilierfehler.
Code: Alles auswählen
unit1.pas(64,38) Error: Can't determine which overloaded function to call
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Michl
Beiträge: 2513 Registriert: Di 19. Jun 2012, 12:54
Beitrag
von Michl » Mi 22. Apr 2015, 20:50
Was ist mit?:
Code: Alles auswählen
Canvas.TextOut((i - 0) * 10, 10, UTF8Encode(AnsiString(Char(i))));
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Mathias
Beiträge: 7317 Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz
Beitrag
von Mathias » Mi 22. Apr 2015, 21:19
Michl hat geschrieben: Was ist mit?:
Code: Alles auswählen
Canvas.TextOut((i - 0) * 10, 10, UTF8Encode(AnsiString(Char(i))));
Danke, das ist die Lösung.
Somit habe ich auch die Umlaute als einzelnes Zeichen.
Code: Alles auswählen
Canvas.TextOut(10, 40, UTF8Encode(ansistring(UTF8ToConsole('äöü'))));
ch := UTF8ToConsole('ä')[1];
Canvas.TextOut(10, 60, UTF8Encode(ansistring(ch)));
ch := UTF8ToConsole('Ä')[1];
Canvas.TextOut(20, 60, UTF8Encode(ansistring(ch)));
ch := UTF8ToConsole('ü')[1];
Canvas.TextOut(30, 60, UTF8Encode(ansistring(ch)));
Ich brauche das Ganze für eine Text-Ausgabe in OpenGL.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
theo
Beiträge: 11344 Registriert: Mo 11. Sep 2006, 19:01
Beitrag
von theo » Mi 22. Apr 2015, 21:37
Mathias hat geschrieben: Ich will den kompletten ASCII-Code ausgeben.
Die Zeichen zwischen 128 und 256 kommen nicht.
ASCII definiert diese Zeichen gar nicht.
Du meinst wohl einen ANSI 8-bit Zeichensatz.
Mathias
Beiträge: 7317 Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz
Beitrag
von Mathias » Do 23. Apr 2015, 17:42
Dies war wohl leider auch nichts, unter Windows geht es, aber Linux will es nicht.
Was für einen String/Zeichensatz muss ich nehmen, das Umlaute auch 8Bit sind ?
Mit dem Standard-IBM Zeichensatz geht es nicht, so wie ich es festgestellt habe.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
theo
Beiträge: 11344 Registriert: Mo 11. Sep 2006, 19:01
Beitrag
von theo » Do 23. Apr 2015, 18:32
Mathias hat geschrieben: Dies war wohl leider auch nichts, unter Windows geht es, aber Linux will es nicht.
Hätte ich dir sagen können. Beim Thema Zeichensatz/Unicode wird immer wieder gerne gefährliches Halbwissen verbreitet und alle haben dazu eine "Meinung", selten aber eine Ahnung
Ich weiß nicht was du willst und ich weiß nicht warum du es willst, aber wenn du die ersten 256 Unicode Zeichen ausgeben willst, dann ginge das so:
Code: Alles auswählen
var
i: Integer;
begin
for i:=0 to $FF do Memo1.Lines.Add(UTF8Decode(WideChar(Word(i))));
end;
Mathias
Beiträge: 7317 Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz
Beitrag
von Mathias » Do 23. Apr 2015, 19:46
Geht nicht, es kommen nur die ersten 128 Zeichen richtig, der Rest ist nur '?' .
Wen ich den Font vom Memo1 auf:
Chartset=OEM_CHARSET
Name=Terminal
bringt auch nichts.
Mit
Code: Alles auswählen
Canvas.TextOut((i - 0) *7, 10, UTF8Decode(WideChar(Word(i))));
kommt es gleich falsch.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Michl
Beiträge: 2513 Registriert: Di 19. Jun 2012, 12:54
Beitrag
von Michl » Do 23. Apr 2015, 20:07
Unter Windows ginge auch:
Code: Alles auswählen
uses LConvEncoding;
Canvas.TextOut((i - 0) * 10, 10, CP1252ToUTF8(Char(i)));
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
theo
Beiträge: 11344 Registriert: Mo 11. Sep 2006, 19:01
Beitrag
von theo » Do 23. Apr 2015, 21:11
Mathias hat geschrieben: Geht nicht, es kommen nur die ersten 128 Zeichen richtig, der Rest ist nur '?' .
Ja, da habe ich einen Fehler gemacht.
Probier mal so:
Code: Alles auswählen
uses LazUTF8;
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i:=0 to $FF do Memo1.Lines.Add(UnicodeToUTF8(i));
end;
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
Beitrag
von mschnell » Fr 24. Apr 2015, 11:50
Mathias hat geschrieben: Ich will den kompletten ASCII-Code ausgeben.
Die Zeichen zwischen 128 und 256 kommen nicht.
(Du meinst vermutlich 128 bis 255)
Diese Zeichen gibt's bei ASCII nicht.
Und die Steuerzeichen 0 bis 31 sowie 127 kannst Du nicht "ausgeben" (womit Du vermutlich "irgendwie standardmäßig grafisch aufmalen" meinst) .
-Michael
Mathias
Beiträge: 7317 Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz
Beitrag
von Mathias » Fr 24. Apr 2015, 18:21
Mit UnicodeToUTF8 bin ich jetzt einiges weiter gekommen, ich kann jetzt Umlaute in meiner Animation darstellen und dies unter Win und Linux.
Ein Wehrmutstropfen, ich kann nicht direkt Draw('ä') eingeben, ich muss es mit Draw(#228) machen.
Ich habe den Befehl UTF8ToUnicode angeguckt, leider geht nicht einfach Draw(UTF8ToUnicode('ä'));
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mathias
Beiträge: 7317 Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz
Beitrag
von Mathias » Sa 25. Apr 2015, 17:53
Mit
Code: Alles auswählen
var UnicodeText : UnicodeString;
UnicodeText := UTF8Decode(Text); gehts.
Wichtig ist, das UnicodeText als UnicodeString deklariert ist, bei nur String macht Linux Probleme.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot