[gelöst] Stringhelper verwenden?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1639
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

[gelöst] Stringhelper verwenden?

Beitrag von fliegermichl »

Hallo,

ich bin grad ein kleines Progrämmelchen am basteln, bei dem ich zwei EditControls habe, die jeweils einen Integerwert beinhalten sollen (edStart und edEnde).
Nun wollte ich mal die Neuerungen vom fpc nutzen und hab folgendes geschrieben:

Code: Alles auswählen

procedure Button1Click(Sender : TObject);
var i, start, ende : integer;
begin
 start := edStart.Text.toInteger;
 ende := edEnde.Text.toInteger;
 ...
end;
Da meckert mir der Compiler bei beiden Zeilen was von Illegal qualifier.
Wenn ich aber mit Strg+Linksklick auf .toInteger klicke, so wird der entsprechende Eintrag in syshelph.inc angezeigt.

Kann mir jemand verraten, wie man diese Helper nutzt?

Danke Michael

Edit: Hab's gerade herausgefunden. Indem man einen expliziten cast auf string macht.

Code: Alles auswählen

 start := string(edStart.Text).toIntegegr;

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

Re: [gelöst] Stringhelper verwenden?

Beitrag von theo »

Ja, bei den Helpern müssen für FPC anscheinend immer die genauen Typen stimmen. Der IDE ist es anscheinend egal.
Mann kann sich das auch selber erweitern, dass es auch mit TCaption bzw. TTranslateString geht (unten).
Habe noch keinen Weg gefunden, wie man alles vom ursprünglichen Helper (Hier TStringHelper) erben kann. Weiss das jemand?

Code: Alles auswählen

{$mode objfpc}{$H+}
{$modeswitch TypeHelpers}
...
type

  { TTranslateStringHelper }

  TTranslateStringHelper = type helper for TTranslateString
    function ToInteger: integer; overload; inline;
  end;
...
implementation

{ TTranslateStringHelper }

function TTranslateStringHelper.ToInteger: integer;
begin
  Result := String(Self).ToInteger;
end;

Warf
Beiträge: 2118
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: [gelöst] Stringhelper verwenden?

Beitrag von Warf »

Das liegt daran das TCaption kein String ist sondern ein TTranslateString, definiert als:

Code: Alles auswählen

  TTranslateString = type String; 
D.h. TTranslateString ist nicht ein Alias auf String, sondern (wegen dem type keyword) ist so zu sagen eine "kopie" des typs string unter neuem namen. Damit ist das ein eigenständiger typ und somit unabhängig von allen Erweiterungen die du String gibst.

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

Re: [gelöst] Stringhelper verwenden?

Beitrag von theo »

Warf hat geschrieben: Do 22. Jun 2023, 16:27 Das liegt daran das TCaption kein String ist sondern ein TTranslateString, definiert als:

Code: Alles auswählen

  TTranslateString = type String; 
D.h. TTranslateString ist nicht ein Alias auf String, sondern (wegen dem type keyword) ist so zu sagen eine "kopie" des typs string unter neuem namen. Damit ist das ein eigenständiger typ und somit unabhängig von allen Erweiterungen die du String gibst.
Ja, danke!
Das ist mir soweit schon klar. Ich dachte nur, dass es vielleicht einen Trick gibt, weil das Bedürfnis danach doch recht offensichtlich ist.
Aber ja, man könnte den ganzen Krempel für TTranslateString einfach kopieren.
Warum gibt es das nicht schon? (Mir ist auch klar, dass TStringHelper zu Sysutils/FPC und TTranslateString zur LCL gehört).

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1639
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: [gelöst] Stringhelper verwenden?

Beitrag von fliegermichl »

Wozu ist denn das überhaupt gedacht, daß man mittels neuertyp = type altertyp eine Kopie eines Typen deklarieren kann.
Ich kann da irgendwie keinen Nutzen entdecken, außer das die Helper nicht funktionieren.

Warf
Beiträge: 2118
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: [gelöst] Stringhelper verwenden?

Beitrag von Warf »

Ich vermute mal bei TTranslatedString hat das was mit RTTI zu tun. Die Internationalization muss ja erkennen an welcher stelle Übersetzungen benötigt werden und an welcher nicht. So macht es z.B. keinen Sinn den FileName des OpenDialogs zu übersetzen ist ja unsinnig. Somit kann praktisch die Anwendung einfach mit RTTI durch alle Properties gehen die vom typen TTranslatedString sind, und für die i18n code ausführen, und alle String daten ignorieren.

Bei nicht Basistypen gibt das ganze noch einen größeren Vorteil, du kannst damit einen neuen typen erstellen die nicht mit dem original kompatibel sind. Beispiel:

Code: Alles auswählen

type
  TVector = record
    X, Y: Integer;
  end;
  TPosition = type TVector;
  TSize = type TVector;

procedure Draw(Position: TPosition; Size: TSize);
begin

end;

var
  pos: TPosition;
  sz: TSize;
begin
  Draw(sz, pos); // Error weil falschrum
Damit kann man sicherstellen das wenn man mehrere argumente des selben typs, aber mit unterschiedlicher Semantischer Bedeutung hat, diese vom Compiler checken zu lassen. Wie man oben sehen kann, wenn man ausversehen die reihenfolge der Parameter vertauscht meckert der Compiler.

Leider geht das nicht für Basisdatentypen, wäre äußerst nützlich sowas machen zu können:

Code: Alles auswählen

type
  THost = type String;
  TUser = type String;
  TPassword = type String;
  
proceudre DataBaseLogin(AHost: THost; AUser: TUser; APassword: TPassword = '');

[...]
DatabaseLogin(DBUser, DBPass);
Da hier APassword den Default Wert '' hat, reicht es 2 parameter zu übergeben. Wenn jetzt von allen der typ String ist, bedeutet das die anwendung kompiliert indem einfach DBUser als Host übergeben wird, und DBPass als User, und das Passwort bleibt leer. Wenn das mit dem typing strikt checken würde hingegen, würde hier der Compiler meckern das DBUser kein gültiger THost ist.
Denn ich hatte es schon öfter das wenn man parameter einfach an funktionen weiter durreicht und dann mal was vergisst, ausversehen falschrum angibt, oder sich die funktionsdefinition geändert hat und jetzt ein neuer Parameter benötigt wird aber nicht alle Nutzungen angepasst wurden.

Es ist eigentlich komplett unsinnig das man alle arten von Text gleichbehandelt. Eine E-Mail Addresse hat andere semantische Eigenschaften als ein Passwort, was wieder anders ist als eine IP Addresse, was wiederum was komplett anderes ist als ein Pfad.
Dennoch benutzt alles den selben typen und ist damit gegeneinander austauschbar. Wir verlieren massive Vorteile die wir durch Typchecking an anderer stelle (wie Klassen oder Record typen) haben, weil wir für alles was Text ist string benutzen

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1639
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: [gelöst] Stringhelper verwenden?

Beitrag von fliegermichl »

Danke für die Erklärung. Ja da macht es Sinn.

Benutzeravatar
photor
Beiträge: 512
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 3.2 (Gtk2) FPC 3.2.2
CPU-Target: 64Bit

Re: [gelöst] Stringhelper verwenden?

Beitrag von photor »

Moin,
fliegermichl hat geschrieben: Fr 23. Jun 2023, 11:55 Wozu ist denn das überhaupt gedacht, daß man mittels neuertyp = type altertyp eine Kopie eines Typen deklarieren kann.
Aus Erfahrung: ich definiere mir gerne mindestens ein

Code: Alles auswählen

type
  TMyReal = double;

zentral in eine Unit, die von allen anderen ge-uses-t wird, damit ich im Programm selbst nur alle real-, double-, float-, extended-Typen umbenennen kann und sicher bin, dass alles miteinander kompatibel ist. Wie gesagt aus Erfahrung: wenn man viel in altem Code, der von vielen unterschiedlichen und nicht mehr erreichbaren Leuten verbrochen wurde ... Das ist sicher nicht die ursprüngliche Intension - aber es hilft.

Ciao,
Photor

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

Re: [gelöst] Stringhelper verwenden?

Beitrag von theo »

photor hat geschrieben: Fr 23. Jun 2023, 15:45

Code: Alles auswählen

 
type
  TMyReal = double;

zentral in eine Unit, die von allen anderen ge-uses-t wird, damit ich im Programm selbst nur alle real-, double-, float-, extended-Typen umbenennen kann und sicher bin, dass alles miteinander kompatibel ist. Wie gesagt aus Erfahrung: wenn man viel in altem Code, der von vielen unterschiedlichen und nicht mehr erreichbaren Leuten verbrochen wurde ... Das ist sicher nicht die ursprüngliche Intension - aber es hilft.
Das ist aber ein Alias und nicht

Code: Alles auswählen

 
type
  TMyReal = type double;

Der Alias ist ja nicht das Problem.

P.S. Kannst deinem Avatar die Maske jetzt abnehmen. Mir gibt der Anblick ein schlechtes Gefühl, da er mich an eine vergangene Scheiss-Zeit erinnert. :wink:

Benutzeravatar
photor
Beiträge: 512
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 3.2 (Gtk2) FPC 3.2.2
CPU-Target: 64Bit

Re: [gelöst] Stringhelper verwenden?

Beitrag von photor »

theo hat geschrieben: Fr 23. Jun 2023, 17:07
photor hat geschrieben: Fr 23. Jun 2023, 15:45

Code: Alles auswählen

 
type
  TMyReal = double;

zentral in eine Unit, die von allen anderen ge-uses-t wird, damit ich im Programm selbst nur alle real-, double-, float-, extended-Typen umbenennen kann und sicher bin, dass alles miteinander kompatibel ist. Wie gesagt aus Erfahrung: wenn man viel in altem Code, der von vielen unterschiedlichen und nicht mehr erreichbaren Leuten verbrochen wurde ... Das ist sicher nicht die ursprüngliche Intension - aber es hilft.
Das ist aber ein Alias und nicht

Code: Alles auswählen

 
type
  TMyReal = type double;

Der Alias ist ja nicht das Problem.
Ok. Den feinen Unterschied hatte/habe ich nicht auf dem Schirm - dem muss ich mal nachsteigen.
theo hat geschrieben: Fr 23. Jun 2023, 17:07 P.S. Kannst deinem Avatar die Maske jetzt abnehmen. Mir gibt der Anblick ein schlechtes Gefühl, da er mich an eine vergangene Scheiss-Zeit erinnert. :wink:
hatte letztens schon eine Anfrage deswegen. Antwort war: wenn es keine Richtlinie zu Avatar gibt - eher nicht. Mein Gesicht würde ich auch dann verbergen wollen. Abgesehen davon nehme ich für mich weiterhin in Anspruch, Maske zu tragen, wenn ich das für nötig halte (Husten Schnupfen Heiserkeit). BTW ich finde die asiatische Art, wie Selbstverständlich die Mitmenschen zu schützen, wenn man sie anstecken könnte, sehr bewundernswert - seht es einfach als Homage an diese Art.

PS: wenn das Thema werden soll - dann soll der Admin das bitte in einen anderen Bereich des Forums verlegen weil total Off-Topic.

Ciao,
Photor

Antworten