Unterschiede: Delphi<>Lazarus TInifile und Stringfunkt

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Unterschiede: Delphi<>Lazarus TInifile und Stringfunkt

Beitrag von Targion »

Hallo!
In einem von Delphi nach Lazarus portierten Projekt (um es auch auf Linux lauffähig zu machen) gibt es massive Probleme, da die Stringfunktionen copy() und delete() anscheinend irgendwie anders funktionieren. Gibt es einen Unterschied zwischen Delphis TIniFile und dem von Lazarus? Wenn ich die ganzen Unterschiede kenne, ist es einfacher, das Projekt anzupassen, als wenn ich in über 10.000 Zeilen Try-and-Error versuche.
Danke schonmal!
Targion

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Was hat copy() und delete() mit Inifile zu tun?

Soweit ich weiß, sind Copy und delete() absolut identisch deklariert.

Bei TIniFile bin ich mir nicht sicher, aber ich würde sagen, das sollte sich auch nicht sonderlich von Delphi unterscheiden.
Johannes

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Beitrag von Targion »

Da habe ich getippt ohne nachzudenken... Also das 1. und eigentliche Problem ist, dass copy(h,0,1)='°' nicht wahr ist, obwohl das erste Zeichen im String h ein ° ist. (Daher kam ich auf die Idee, dass die Funktionen verschieden sind)

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Dann scheint das doch nicht das erste Zeichen zu sein...vielleicht ein Leerzeichen davor? Bzw. einfach mal Copy(Trim(h), 0, 1)... probieren.

Ich habs gerade probiert und es funktioniert bestens und ich bekomm die entsprechende Nachricht:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var temp: string;
begin
  temp := '°1234';
  if Copy(temp, 0, 1) = '°' then
    ShowMessage('Erstes Zeichen ist ein °')
  else
    ShowMessage(Copy(temp, 0, 1));
end;
Johannes

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Beitrag von Targion »

Also, es ist kein Leerzeichen davor... Und es funktioniert trotzdem nicht!
Die Stelle sieht jetzt so aus:

Code: Alles auswählen

if copy(Trim(h),0,1) = '°' then begin
Also ich kann echt keinen Fehler finden!!

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

Beitrag von theo »

Erstens fangen Strings bei 1 an, nicht bei 0.
Also Copy(temp,1,1) wäre besser, obwohl der Compiler so freundlich ist, das 0 auch zu schlucken.
Das ist aber nicht dein Problem.
Mit Zeichen > #127 kann's schwierig werden, da dann die $LANG Einstellungen im Editor eine Rolle Spielen. Versuch mal gegen #186 zu testen.

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Beitrag von Targion »

Immernoch kein Erfolg:

Code: Alles auswählen

if copy(h,1,1) = #186 then begin
(Irgendwo stand, dass Strings mit 0 beginnen... Ich suche mal danach. Aber egal!)

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

Beitrag von theo »

Targion hat geschrieben: (Irgendwo stand, dass Strings mit 0 beginnen... Ich suche mal danach. Aber egal!)
Naja der "Beweis" ist relativ einfach: Der zweite Buchstabe ist in h[2], h[0] und h[1] sind identisch. Also saubererweise ist der erste Buchstabe in 1 zu holen.

Wie liest du denn dein h ein?

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Beitrag von Targion »

So:

Code: Alles auswählen

h:=db.ReadString('XModule('+IntToStr(i)+')','ID'+IntToStr(j),'');
i,j: Integer

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

nur mal in den Raum geworfen, kann es mit Ansi vs. UTF zusammenhängen?
Johannes

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

Beitrag von theo »

@Monta: Ja, vor allem wenn er unter GTK2 IDE arbeitet, dort müsste der Editor eigentlich auf UTF8 laufen. Wenn er dann mit Latin1 Daten vergleicht, kann's Probleme geben.
@Targion: Wie sieht denn der String aus, wenn du den in einem Memo ausgibst?
Siehst du das '°' ?

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Beitrag von Targion »

Ja, tue ich. ich habe die Datei schon vorher UTF8-Kodiert

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Beitrag von Targion »

Der Test auf ein ° geht übrigens auch nicht, wenn ich dieses vorher an den String angefügt habe! Irgendwas stimmt da garnicht...

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Wiso probierst du nicht mal mit da kommt mit sicherheit nicht ° raus

Showmessage(char(h[1]));
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Beitrag von Targion »

Ja, da steht dann ein "?" anstatt dem °. Das muss doch irgendwo an der Kodierung liegen...
Aber wenn ich den String auf "?" teste, kommt auch kein Okay.
Welchen Zahlenwert hat ° in der UTF-8 Codierung?

Antworten