Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Mathias
Beiträge: 6906 Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz
Beitrag
von Mathias » Sa 8. Mär 2014, 13:44
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
Beitrag
von mschnell » Sa 8. Mär 2014, 13:54
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:
Beitrag
von Socke » Sa 8. Mär 2014, 20:23
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
theo
Beiträge: 10867 Registriert: Mo 11. Sep 2006, 19:01
Beitrag
von theo » Sa 8. Mär 2014, 21:31
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?
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:
Beitrag
von m.fuchs » Sa 8. Mär 2014, 22:32
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
Beitrag
von Mathias » Mo 10. Mär 2014, 19:31
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
Beitrag
von Mathias » So 11. Mai 2014, 18:50
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
theo
Beiträge: 10867 Registriert: Mo 11. Sep 2006, 19:01
Beitrag
von theo » So 11. Mai 2014, 19:07
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
Beitrag
von Mathias » So 11. Mai 2014, 19:51
Ich habe e unterdessen mit Delphi 6 getestet.
Da gehen beide Zeilen nicht.
Könnte ein Bug von FPC 2.6.2 sein.
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
Beitrag
von Michl » So 11. Mai 2014, 20:20
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
Beitrag
von Mathias » So 11. Mai 2014, 23:04
Es ist schon komische, das ich immer wieder Bugs endecke.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
theo
Beiträge: 10867 Registriert: Mo 11. Sep 2006, 19:01
Beitrag
von theo » So 11. Mai 2014, 23:18
Mathias hat geschrieben: Es ist schon komische, das ich immer wieder Bugs endecke.
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.
Mathias
Beiträge: 6906 Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz
Beitrag
von Mathias » Mo 12. Mai 2014, 17:40
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