Problem mit Ascii-Ansi

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
haderlump
Beiträge: 188
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Problem mit Ascii-Ansi

Beitrag von haderlump »

Hallo zusammen
Ich habe ein Kombifeld, das ich aus einer Datei mit Werten fülle.

Code: Alles auswählen

 
procedure TCV_Form.FormCreate(Sender: TObject);
var
  CVListe :textfile;
  zeile,puffer,a : string;
  zeilennummer,spalte : integer;
  begin
    zeilennummer :=1;
    Spalte :=1;
 
    AssignFile(CVliste,'CV_Tabelle.txt');
    Reset(CVListe);
    while not eof(CVListe) do
    begin
        Readln(CVListe,zeile);
        puffer := copy(zeile,0,3);
        CV_Liste [zeilennummer].nummer := strToInt(puffer);
        CV_Liste [zeilennummer].Bezeichnung:= copy(zeile,5,33);
        puffer := copy(zeile,39,2);
        CV_Liste [zeilennummer].min:= strToInt(puffer);
        puffer := copy(zeile,42,3);
        CV_Liste [zeilennummer].max:= strToInt(puffer);
        zeilennummer := zeilennummer + 1;
        LokCV_Listbox.items.add(zeile)
    end   ;
    CloseFile(CVListe);
end;      
Das geht soweit auch .
Allerdings gibt es Probleme bei der Umlautdarstellung. Diese werden mit einem Fragezeichen angezeigt.
Kann es sein dass hier ein ANSI - ASCII Conflikt vorliegt.
Ich habe die Datei mit dem Windows - Edior derstellt, und als ANSI abgespeichert.

hier der Text, falls es zur Beurteilung nötig ist.

Code: Alles auswählen

 
001,Primäradresse                    ,00,127
002,Minimalspannung                  ,00,255
003,Beschleunigungsrate              ,00,255
004,Verzögerungsrate                 ,00,255
005,Höchstspannung                   ,00,255
008,Decoder Reset                    ,00,000
009,Motorfrequenz                    ,00,001
012,Analogmodus                      ,00,001
013,Funktionen im Analogbetrieb      ,00,255	
017,Erweiterte Decoderadresse LSB    ,00,255
018,Erweiterte Decoderadresse MSB    ,00,255
019,Consistadresse                   ,00,127
020,Bremsverhalten b. Gleichspannung ,00,048 
029,Konfigurationsdaten              ,00,064
033,F0 vorwärts an                   ,00,003
034,F0 rückwärts an                  ,00,003
035,F1                               ,00,003
036,F2                               ,00,003
037,F3                               ,00,003
038,F4                               ,00,003
039,F5                               ,00,003
040,F6                               ,00,003
041,F7                               ,00,003
042,F8                               ,00,003
043,F9                               ,00,003
044,F10                              ,00,003
045,F11                              ,00,003
046,F12                              ,00,003
049,Konfigurationsdaten 2            ,00,127
050,Prop. Anteil Lastregelung        ,00,255
051,Integr. Anteil Lastregelung      ,00,255
052,Diff. Anteil Lastregelung        ,00,255
053,AUX1 richtungsabhängig           ,00,255
054,AUX2                             ,00,255
062,AUX1/2 Dimmung                   ,00,255
065,Anfahr-Kick                      ,00,014
067,Alt. Kennlinie                   ,00,255
112,Blinkfrequenz der Beleuchtung    ,10,255
113,Interne Fahrstufe CV#116         ,01,126
115,Rangierlicht                     ,00,255
116,Geschwindigkeitsabhängiges Dimmen,00,063
 
Wie löse ich das Problem ?
Danke im Voraus
Fritz

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Problem mit Ascii-Ansi

Beitrag von mse »

Probiere mal etwa so:

Code: Alles auswählen

 
procedure TCV_Form.FormCreate(Sender: TObject);
var
  CVListe :textfile;
  ansizeile: string;
  zeile,puffer,a : UnicodeString;
  zeilennummer,spalte : integer;
  begin
    zeilennummer :=1;
    Spalte :=1;
 
    AssignFile(CVliste,'CV_Tabelle.txt');
    Reset(CVListe);
    while not eof(CVListe) do
    begin
        Readln(CVListe,ansizeile);
        zeile:= ansizeile; //konvertiert automatisch von 8bit system codierung zu utf-16
        puffer := copy(zeile,0,3);
        CV_Liste [zeilennummer].nummer := strToInt(puffer);
        CV_Liste [zeilennummer].Bezeichnung:= copy(zeile,5,33);
        puffer := copy(zeile,39,2);
        CV_Liste [zeilennummer].min:= strToInt(puffer);
        puffer := copy(zeile,42,3);
        CV_Liste [zeilennummer].max:= strToInt(puffer);
        zeilennummer := zeilennummer + 1;
        LokCV_Listbox.items.add(utf8encode(zeile))
    end   ;
    CloseFile(CVListe);
end;      
(Ungeprüft!)

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Problem mit Ascii-Ansi

Beitrag von Antrepolit »

@haderlump:
Den ganzen Code kannst du dir sparen. Benutze die Klasse TStringList:

Code: Alles auswählen

 
procedure TCV_Form.FormCreate(Sender: TObject);
var
  lList: TStringList;
begin
  lList := TStringList.Create;
  try
    lList.LoadFromFile('CV_Tabelle.txt');
    lList.Text := UTF8Encode(lList.Text);
    LokCV_Listbox.items.Assign(lList);
  finally
    FreeAndNil(lList);
  end;
end;
 
Grüße, Antrepolit

care only if your os is really burning

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

Re: Problem mit Ascii-Ansi

Beitrag von theo »

Antrepolit hat geschrieben:@haderlump:
Den ganzen Code kannst du dir sparen. Benutze die Klasse TStringList:
Ist vom Vorgehen her mMn richtig, aber ich würde SysToUTF8 verwenden.
UTF8Encode arbeitet mit UnicodeString (WideString) und das liegt nicht vor.
Ausserdem würde die Methode so auch auf Linux eher funktionieren.

haderlump
Beiträge: 188
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Problem mit Ascii-Ansi

Beitrag von haderlump »

Danke zusammen.
Hat geklappt.

mse: so ging es leider nicht. Ich bekam eine Fehlermeldung.

Andrepolit: Das funktionierte auf Anhieb. Danke.

theo: Es hat sich erledigt.

An Alle Danke noch mal.

Gruß Fritz

Antworten