Umgang mit Operatoren [gelöst]

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Umgang mit Operatoren [gelöst]

Beitrag von corpsman »

Hallo, ich komme ja aus der Delphi 5 Welt, da gibt es keine Generik und auch keine Überladenen Operatoren.

Ich kenne das aus dem Studium und habe nun mitbekommen das FPC all diese wunderschönen Dinge kann.

Nach einer kleinen Google Lehrstunde habe ich mich nun an das Überladen von Operatoren gemacht.

Im Prinzip scheint dies ja auch super einfach zu sein. Bis auf die Zuweisung an Strings :

Code: Alles auswählen

Operator := (f: TFraction): String;
..
Var
  s: String;
  b:Tfraction;
Begin
  b := Fraction(strtoint(edit1.text), strtoint(edit2.text));
  // ein   label4.Caption := b; geht leider nicht.
  s := b;
  label4.Caption := s;
Der Compiler bewirft mich damit das ein String <> Translatestring sei, klar das hier das Typsystem schreit, aber so ganz klar ist mir das nicht.

Könnt ihr mir das ganze erklären ?

Im Anhang habe ich auch gleich mal meine "ufraction.pas" mit angehängt, auf das ein Wissender mir sagt ob ich das so alles richtig umgesetzt habe.

Gruß

Corpsman
Dateianhänge
ufraction.pas
(3.82 KiB) 61-mal heruntergeladen
Zuletzt geändert von corpsman am Mo 1. Nov 2010, 21:42, insgesamt 1-mal geändert.
--
Just try it

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

Re: Umgang mit Operatoren

Beitrag von theo »

Der ist wohl ein bisschen genau mit den Typen. Warum kann ich auch nicht sagen.
Du hast zwei Möglichkeiten afaics:

Typecasten:
label4.Caption:=String(b);

oder für TTranslateString (unit LCLType) nochmal überladen:
Operator := (f: TFraction): TTranslateString;

etc.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Umgang mit Operatoren

Beitrag von corpsman »

*g*

habe es noch mal überladen.

Den Rest habe ich dann wohl richtig gemacht ?

das Ganze gibt es ja noch als

Code: Alles auswählen

Type xy = class;
  class Operator ??
  end;
Was hats eigentlich damit auf sich, wofür benutze ich die ?
--
Just try it

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

Re: Umgang mit Operatoren

Beitrag von theo »

Ich weiss nicht, worauf du dich hier beziehst. Hast du mal einen Link dazu?

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Umgang mit Operatoren

Beitrag von corpsman »

ja hab ich

z.B. Hier

in Delphi gibts auch noch

Code: Alles auswählen

class function bla() 
//bzw.
class function TBla.bla
siehe Hier
--
Just try it

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

Re: Umgang mit Operatoren

Beitrag von theo »

Mit dem ersteren kenne ich mich nicht aus (class operator). Ich weiss nicht ob FPC das hat oder braucht. Klingt nach .NET Kompatibilität.

Klassenmethoden gibt's hingegen schon lange.
Das sind Methoden, die man ohne Instanz aufrufen kann, also z.B.:

Code: Alles auswählen

TForm1 = class(TForm)
    Button1:TButton;
    procedure Button1Click(Sender:TObject);
  private
    { private declarations }
    class function Version: string;
  public
    { public declarations }
  end;
 
etc...
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender:TObject);
begin
 ShowMessage(TForm1.Version);
end;
 
class function TForm1.Version:string;
begin
  Result:='Version 11';
end;
Also TForm1.Version. Du musst also nicht erst eine Form1 createn.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Umgang mit Operatoren

Beitrag von corpsman »

ok, was eine Class Funktion ist hab ich nun verstanden, aber die sind ja dann mit Vorsicht zu genießen. Auf Private Elemente der Klasse kann ja nicht zugreifen ( da es ja keine Instanz der Klasse gibt), wofür braucht man die dann ?
--
Just try it

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Umgang mit Operatoren

Beitrag von carli »

corpsman hat geschrieben:ok, was eine Class Funktion ist hab ich nun verstanden, aber die sind ja dann mit Vorsicht zu genießen. Auf Private Elemente der Klasse kann ja nicht zugreifen ( da es ja keine Instanz der Klasse gibt), wofür braucht man die dann ?
Man kann nicht nur auf private Elemente zugreifen, man kann generell nicht auf die Felder zugreifen.

Was es bringt? Naja der Code sieht schöner aus, wenn man sagt TSubModul.Tuewas(); - man spart sich "globale Funktionen"

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

Re: Umgang mit Operatoren

Beitrag von theo »

Brauchen kann man das, wenn man Beispielsweise eine Basisklasse TImageReader hat.
Dann hat man spezifische Reader die von dieser abgeleitet sind, diese sind in einer Liste als Reader registriert.
Nun kann man die Liste durchgehen, und schauen, welcher Reader für z.B. eine File-Extension/Mime-Typ zuständig ist.

z.B.

class function TOPGIFImage.GetFileExtensions: string;
begin
Result := 'gif';
end;

Das ist ziemlich elegant, und man muss die Klasse nicht instantiieren, falls sie das Format nicht lesen kann.

Sonst wird es auch wie Carli schon sagt, als eine Art Namespace eingesetzt.
z.B. TCharacter.IsNumber();
etc.
Anstatt dass die Funktion IsNumber irgendwo "rumliegt", ist sie nun auch für Code-Insight eindeutig Teil von TCharacter.
Man braucht aber kein TCharacter.Create(); um sie zu nutzen.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Umgang mit Operatoren

Beitrag von corpsman »

Vielen Dank für die Lehrreichen Informationen.
--
Just try it

Antworten