Type Helper

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Type Helper

Beitrag von Mathias »

Er findet die Deklaration von Helper nicht.
Was für eine Unit muss ich einbinden.
Als Muster habe ich syshelph.inc genommen, das es aber eine inc ist, kann ich die Uses nicht finden.

Code: Alles auswählen

type
  TStringHelper = Type Helper for AnsiString
  end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Type Helper

Beitrag von theo »

Code: Alles auswählen

{$modeswitch typehelpers}     


Steht eig. hier http://wiki.freepascal.org/FPC_New_Feat ... pe_helpers

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Type Helper

Beitrag von marcov »

Oder $mode delphi nutzen.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Type Helper

Beitrag von Mathias »

theo hat geschrieben:

Code: Alles auswählen

{$modeswitch typehelpers}     


Steht eig. hier http://wiki.freepascal.org/FPC_New_Feat ... pe_helpers


Danke das wars.

Code: Alles auswählen

type
  TIntHelper = Type Helper for Integer
  public
    procedure Add;
  end;
 
procedure TIntHelper.Add;
begin
   self += 1;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i:Integer;
begin
  i:=1;
  i.Add;
  ShowMessage(IntToStr(i));
end;   


Das Ergebnis ist 2.

Nur der JCF-Formater hat Probleme damit. der wäre sowieso mal überfällig zu aktualisieren.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Type Helper

Beitrag von Mathias »

So wie es aussieht, geht dies nur mit Standard-Typen, ich habe es mit einem Eigenen probiert, kommt aber "Illegal qualifier".

Code: Alles auswählen

type
  TVector = array[0..2] of Single;
 
  TVectorHelper = Type Helper for TVector
  public
    procedure Add;
  end;
 
procedure TVectorHelper.Add;
begin
  self[0] += 1.0;
  self[1] += 1.0;
  self[2] += 1.0;
end;
 
{ TIntHelper }
 
procedure TIntHelper.Add;
begin
   self += 1;
end;
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i:Integer;
  v:TVector;
begin
  i:=1;
  i.Add// Ohne Probleme.
  ShowMessage(IntToStr(i));
  v.Add// Da kommt der Fehler.
end;


Mache ich etwas falsch ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Type Helper

Beitrag von theo »

Weiß ich auch nicht. Vllt. mal hier fragen: http://lists.freepascal.org/cgi-bin/mai ... /fpc-devel

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Type Helper

Beitrag von Mathias »

Ich habe denen eine Mail geschrieben, ich hoffe Google hat gut übersetzt. ;)
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Type Helper

Beitrag von theo »

Mathias hat geschrieben:Ich habe denen eine Mail geschrieben, ich hoffe Google hat gut übersetzt. ;)

Kommt glaube ich nur an, wenn du dich vorher registriert hast mit deinem Absender.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Type Helper

Beitrag von Mathias »

Ich habe mich vorhin registriert, weil ich dachte es sei Forum.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Type Helper

Beitrag von theo »

Ich verlinke hier mal die (erste) Antwort für die "Nachwelt".
http://lists.freepascal.org/pipermail/f ... 36457.html

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Type Helper

Beitrag von Mathias »

Habe ich das richtig verstanden, ich sollte einen Bug-Tracker erstellen ?

http://lists.freepascal.org/pipermail/f ... hread.html
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Type Helper

Beitrag von theo »

Mathias hat geschrieben:Habe ich das richtig verstanden, ich sollte einen Bug-Tracker erstellen ?

http://lists.freepascal.org/pipermail/f ... hread.html


Nicht einen Bug Tracker, aber einen Eintrag in den Bug Tracker, mit einem möglichst einfachen Beispiel, welches das Problem zeigt und der Fehlermeldung. http://bugs.freepascal.org/
Außerdem sollst du es nochmal in der Mailing List posten, damit Ondrej auch Bescheid weiß.

Die allgemeine Meinung ist, dass das eigentlich funktionieren müsste für statische Arrays.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Type Helper

Beitrag von Mathias »

Ich habe noch verschiedenes ausprobiert.
Das sollte eigentlich reichen für den Eintrag, da man die Fehler gut sieht.

Code: Alles auswählen

type
 
  TVector0 = array[0..2] of Single;    // Fehler bei v.Add. "unit1.pas(67,5) Error: Illegal qualifier"
  TVector1 = array of Single;          // geht
  TVector2 = record                    // Fehler bei public, "unit1.pas(44,3) Error: Type "TVector2" cannot be extended by a type helper"
    a, b, c:single;
  end;
  TVector3 = array of TVector0;        // geht
  TVector4 = string;                   // geht
  TVector5 = TButton;                  // Fehler bei public, "unit1.pas(45,3) Error: Type "TButton" cannot be extended by a type helper"
  TVector6 = array of TButton;         // geht
 
  TVector = TVector1;
 
 
  { TVectorHelper }
 
  TVectorHelper = Type Helper for TVector
  public
    procedure Add;
  end;
 
implementation
 
{$R *.lfm}
 
{ TVectorHelper }
 
procedure TVectorHelper.Add;
begin
  self[0] += 1.1;
  self[1] += 1.1;
  self[2] += 1.1;
end;
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var
  v:TVector;
begin
  SetLength(v, 3);
  v.Add;
  ShowMessage(FloatToStr(v[0]));
end;   
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Type Helper

Beitrag von theo »

Mach nur den TVector0 Fall. So wenig Code wie möglich und nötig, um den Fehler aufzuzeigen und nur einen einzigen Fall.

Wähle als Projekt "FPC" und als Kategorie "Compiler" im Bugtracker.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Type Helper

Beitrag von Mathias »

Ich habe mich nun im Bug-tracker eingeloggt.
Nur finde ich den Button nicht mehr, bei dem man einen neuen Eintrag erfassen kann. :oops:

So nur noch das nötigste.

Code: Alles auswählen

type
  TVector = array[0..2] of Single;
 
  TVectorHelper = Type Helper for TVector
  public
    procedure Add;
  end;
 
procedure TVectorHelper.Add;
begin
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  v:TVector;
begin
  v.Add; // "unit1.pas(53,5) Error: Illegal qualifier"
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten