LazMapViewer Karte zentrieren (gelöst)

Rund um die LCL und andere Komponenten
Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 324
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 4.3, FPC3.2.3
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: LazMapViewer Karte zentrieren (gelöst)

Beitrag von h-elsner »

Ich habe das jetzt mal so gemacht:

Code: Alles auswählen

function StrToFloatDefDec(const fl: string; altres: double; IgnoreLocale: boolean=true): double;
var
   fs: TFormatSettings;

begin
  if IgnoreLocale then begin
    fs:=DefaultFormatSettings;
    fs.DecimalSeparator:='.';
    DefaultFormatSettings.DecimalSeparator:='.';
    result:=StrToFloatDef(fl, altres, fs);
  end else
    result:=StrToFloatDef(fl, altres);
end;
Aber könnte man nicht mit den lokalen FormatSettings nicht eine globale Variable für das ganze Programm anlegen und seine Einstellungen da hart für das Programm machen? Das wäre die Lösung für meine Probleme auch für die anderen Programme für alles mögliche, wo Formatsettings vorkommen.

sstvmaster
Beiträge: 593
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 4.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: LazMapViewer Karte zentrieren (gelöst)

Beitrag von sstvmaster »

Ich habe 2 Tools geschrieben für die Steuerung eines Azimuth/Elevations Rotor.
Hier habe ich von Programmstart her, hart auf '.' (Punkt) als DecimalSeperator umgestellt,

1. Tool:
- Satellitenverfolgung: da ich mit den CelesTrak TLE Daten arbeiten musste.

2. Tool:
- TV Satellitsteuerung: hier habe ich bei den Edit Feldern eine automatisch "Komma zu Punkt" Konvertierung vorgesehen.

Die Tools habe ich dann auf einen englischen Windows und Linux getestet.
LG Maik

Windows 10,
- Lazarus 4.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)

wp_xyz
Beiträge: 5435
Registriert: Fr 8. Apr 2011, 09:01

Re: LazMapViewer Karte zentrieren (gelöst)

Beitrag von wp_xyz »

h-elsner hat geschrieben: Fr 8. Mai 2026, 08:45

Code: Alles auswählen

function StrToFloatDefDec(const fl: string; altres: double; IgnoreLocale: boolean=true): double;
var
   fs: TFormatSettings;

begin
  if IgnoreLocale then begin
    fs:=DefaultFormatSettings;
    fs.DecimalSeparator:='.';
    DefaultFormatSettings.DecimalSeparator:='.';
    result:=StrToFloatDef(fl, altres, fs);
  end else
    result:=StrToFloatDef(fl, altres);
end;
Der Vorteil der lokalen FormatSettings ist gerade, dass DefaultFormatSettings nicht verändert werden müssen, aber du machst das, indem du in der 3.Zeile des "if" den globalen DecimalSeparator auf den Dezimalpunkt setzt. Wenn das wichtig ist, kannst du dir das mit den lokalen FormatSettings komplett sparen.
h-elsner hat geschrieben: Fr 8. Mai 2026, 08:45 Aber könnte man nicht mit den lokalen FormatSettings nicht eine globale Variable für das ganze Programm anlegen und seine Einstellungen da hart für das Programm machen?
Das geht natürlich auch, sofern du nicht globale Variablen generell reduzieren willst Du könntest dir z.B. "PointFormatSettings" definieren, die du dann in StrToFloatDef statt des lokalen fs verwendest:

Code: Alles auswählen

var
  PointFormatSettings: TFormatSettings;
...
  PointFormatSettings.DecimalSeparator := '.';
...
  Result := StrToFloatDef(fl, altres, PointFormatSettings);
Übrigens: StrToFloatDef() halte ich für unpraktisch, weil es im Fall eines Fehlers im zu konvertierenden String klaglos den Default-Wert zurückliefert, ohne dich auf einen vielleicht trivialen Fehler hinzuweisen, und du verbringst Stunden in der Fehlersuche, warum der MapViewer immer an den Ursprung des GPS-Koordinatensystems westlich von Afrika springt. Ich bevorzuge immer TryStrToFloat, das bei einem Fehler einen False-Wert zurückgibt - den kann ich prüfen und darauf reagieren (StrToFloat selbst ginge auch, aber ich versuche Exceptions schon vor der Entstehung zu vermeiden).

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 324
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 4.3, FPC3.2.3
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: LazMapViewer Karte zentrieren (gelöst)

Beitrag von h-elsner »

Das funktiert prächtig mit einer globalen Variable. Wenn das nicht irgendwelche Seiteneffekte hat, mach ich das überall.
Den NMEAreader brache ich nicht wirklich (produktiv), aber aus technischen Interesse hab ich das mal gemacht. Und jetzt stelle ich fest, dass es prima ist, um alle möglichen Sachen an einem eher übersichtlichem Programm auszuprobieren.

Ich liebe eigentlich die Umwandlungsroutinen mit ....Def, weil ich oft mit den Defaultwerten etwas mache. Es muss ja nicht immer Null sein. Betreffs Debugging hast du natürlich recht. Da muss ich mal die einzelenen Fälle anschauen, wo es mehr Sinn macht, Fehler zu finden (z.B. beim Betrachten/Analysieren externer Daten) statt die nur zu Überspringen. Das macht ja auch Sinn, alles was an Fehlern von außen kommt einfach zu ignorieren.

Danke an alle, die mitgeholfen haben.

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 324
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 4.3, FPC3.2.3
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: LazMapViewer Karte zentrieren (gelöst)

Beitrag von h-elsner »

Code: Alles auswählen

function StrToFloatDefDec(const fl: string; altres: double; IgnoreLocale: boolean=true): double;
var
   fs: TFormatSettings;

begin
  if IgnoreLocale then begin
    fs:=DefaultFormatSettings;
    fs.DecimalSeparator:='.';
    DefaultFormatSettings.DecimalSeparator:='.';   // Stimmt, das ist hier Blödsinn
    result:=StrToFloatDef(fl, altres, fs);
  end else
    result:=StrToFloatDef(fl, altres);
end;
Da hast du natürlich Recht, das ist Unsinn an der Stelle.

Antworten