property Variable übergeben

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

property Variable übergeben

Beitrag von Mathias »

Gibt es eine Möglichkeit, eine property-Variable einer procedure zu übergeben und zu ändern ?
So etwa wie in diesem Beispiel.
 

Code: Alles auswählen

var
  Form1: TForm1;
 
implementation
 
procedure test(var col:TColor);
begin
  col:=$FF;
end;
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  test(Color); // Color ist property
end;
 
end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: property Variable übergeben

Beitrag von mschnell »

Nein.

Eine Übergabe als "var" ist technisch das übergeben einer Adresse eines Speicherplatzes.

Da eine Property aber keinen Speicherplatz haben muss, kann man sie auch nicht als var-Parameter übergeben. (noch nicht einmal "inc" geht, obwohl man das der Compiler schon in "a := a + 1" verwandelt und es also theoretisch für eine Propertiy übersetzen _könnte_.

-Michael

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: property Variable übergeben

Beitrag von Socke »

Mathias hat geschrieben:Gibt es eine Möglichkeit, eine property-Variable einer procedure zu übergeben und zu ändern ?
So etwa wie in diesem Beispiel.
Du könntest den Weg über Runtime Type Information gehen. Die Unit typeinfo ist dein Freund.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: property Variable übergeben

Beitrag von theo »

Mathias hat geschrieben:Gibt es eine Möglichkeit, eine property-Variable einer procedure zu übergeben und zu ändern ?
Warum willst du das? Warum kann es keine Feldvariable (fColor) sein oder eine Funktion statt einer Procedure?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2807
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: property Variable übergeben

Beitrag von m.fuchs »

Wenn es wirklich (warum auch immer) eine Prozedur sein soll, dann übergib doch das komplette Objekt. Deine Prozedur kann dann die Eigenschaft ändern.

Code: Alles auswählen

procedure Blafasel(AObject: TMyObject);
begin
  AObject.Color := $FF;
end;
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

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

Re: property Variable übergeben

Beitrag von Mathias »

Ich habe meine Classe umgekrempelt, somit kann ich auf die oben beschrieben Übergabe verzichten.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: property Variable übergeben

Beitrag von Mathias »

Ich habe noch eine Frage zu property.

Wieso funktioniert dieser Befehl Test.SingleArray[1] := 12.34; bei Button2Click ?

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
const
  max = 50;
 
type
  TSingleArray = array [0..max] of single;
 
  { TTest }
 
  TTest = class
  private
    FSingleArray: TSingleArray;
  public
    constructor Create;
    property SingleArray: TSingleArray read FSingleArray;
  end;
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
    Test: TTest;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TTest }
 
constructor TTest.Create;
var
  i: integer;
begin
  inherited;
  for i := 0 to max - 1 do begin
    FSingleArray[i] := 1.11;
  end;
end;
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Test := TTest.Create;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
  a: TSingleArray;
begin
  Test.SingleArray[1] := 12.34; // geht komischerweise
  Test.SingleArray := a;  // Kompilerfehler wie erwartet.
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  Test.Free;
end;
 
end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: property Variable übergeben

Beitrag von theo »

Geht bei mir nicht.
Lazarus 1.3 r45008M FPC 2.7.1 x86_64-linux-gtk 2

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

Re: property Variable übergeben

Beitrag von Mathias »

Ich habe e unterdessen mit Delphi 6 getestet.

Da gehen beide Zeilen nicht.
Könnte ein Bug von FPC 2.6.2 sein.

Code: Alles auswählen

Test.SingleArray[1] := 12.34;
Test.SingleArray := a;         
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: property Variable übergeben

Beitrag von Michl »

Kann das Fehlverhalten bestätigen unter Win64bit, Lazarus 1.2.0 (FPC 2.6.2) 32bit, allerdings gibt es eine Compiler-Fehlermeldung unter Win64bit, Lazarus 1.3 Trunc (FPC 2.7.1 Trunc) 32bit. Sehe keine Notwendigkeit den Bugtracker in Kenntnis zu setzen, da der Fehler schon behoben wurde.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

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

Re: property Variable übergeben

Beitrag von Mathias »

Es ist schon komische, das ich immer wieder Bugs endecke. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: property Variable übergeben

Beitrag von theo »

Mathias hat geschrieben:Es ist schon komische, das ich immer wieder Bugs endecke. :wink:
Das sind typische Betatester Geschichten.
Es ist ja kein Bug, der dich von etwas abhält, deshalb fällt er im normalen Gebrauch nicht auf.
Bzw. der fällt nur auf, wenn jemand komisches Zeug macht, und dann auch noch weiss, dass er komisches Zeug macht. :wink:

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

Re: property Variable übergeben

Beitrag von Mathias »

Hier ist mir der Fehler aufgefallen:

Code: Alles auswählen

type
  TVector3f = array[0..2] of GLfloat;
  TFace = array[0..2] of TVector3f;
  TFaceArray = array of TFace;
 
// Zuerst hatte ich dies so deklariert, ohne Compiler-Fehler:
procedure TJavaVector.WriteVectorTxt(var Vector: array of TFace; Name: string);
// Dann wollte ich verbessern, dann kahm ein Fehler
procedure TJavaVector.WriteVectorTxt(var Vector: TFaceArray; Name: string);
// So ging es wieder
procedure TJavaVector.WriteVectorTxt(const Vector: TFaceArray; Name: string);
 
//Hier kahmen die Fehler:
JavaVector.WriteVectorTxt(Fluegeli.VertexData.Pos, 'FluegeliVectoren');
 
VertexData ist eine Schreibgeschützte property-Variable.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten