Autor Beitrag
Horschdware
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: Di 25.10.11 21:10 
Hallo zusammen,
ich spiele gerade ein wenig mit Delphi XE2 herum und bin auf etwas interessantes gestoßen:
Die Andorra 2D Engine bietet ein paar Nettigkeiten, wie z.B. ein einfaches Einrichten des Vollbildmodus.

Folgendermaßen funktionierte das bisher und ist auch lt. offizieller Doku der Weg zum Ziel:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
    with AdDraw.Display do
    begin
      Width := 800;
      Height := 600;
      BitDepth := ad32Bit; //Die Farbtiefe. Hierbei sind die Werte "ad16Bit" und "ad32Bit" erlaubt.
      DisplayMode := dmFullscreen;
    end;


Unter Delphi XE2 bekomme ich aber beim Versuch einen der Werte in "Display" zu setzen den Fehler "Der linken Seite kann nichts zugewiesen werden".
Beim Versuch den Fehler nachzuvollziehen stoße ich in der Unit "AdDraws" auf folgende relevante Zeile:

ausblenden Delphi-Quelltext
1:
2:
    {The display settings.}
    property Display: TAdDisplay read FDisplay;

Aha, für die Property "Display" ist nur ein read definiert. TAdDisplay selbst ist ein record.

Die Frage die sich mir nun stellt ist nicht "warum geht das in Delphi XE2 nicht?" sondern "Warum geht das in anderen Delphi Versionen überhaupt?". Eine property, die nur zum Lesen definiert ist kann merkwürdigerweise in älteren Delphi Versionen auch geschrieben werden.

Kann mir das jemand erklären?

_________________
Delphi: XE - OS: Windows 7 Professional x64
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 25.10.11 21:32 

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Horschdware Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: Di 25.10.11 21:44 
Danke dir,
an so eine Lösung hatte ich bereits gedacht.

Für mich interessanter ist aber, warum das in älteren Delphi-Versionen so geht und in XE2 eben nicht mehr.
In der DP war dieser Artikel hier verlinkt delphi.about.com/od/.../record_property.htm.
Der kommt der Sache schon recht nahe (impliziter Aufruf impliziter Getter-Methoden), erklärt aber dennoch nicht, warum das Verhalten in XE2 nun anders ist.

_________________
Delphi: XE - OS: Windows 7 Professional x64
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 25.10.11 22:23 
Das ist keine Verhaltensänderung, das ist ein Bugfix ;) .

_________________
>λ=

Für diesen Beitrag haben gedankt: Horschdware
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Mi 26.10.11 11:28 
Für mich wäre das Verhalten von XE2 hier falsch.

Die Property selbst kann nur gelesen, nicht jedoch neu gesetzt werden. Soweit ok und klar, aber die Eigenschaften der Property bzw. des entsprechenden Records/Objects sollten doch änderbar sein.

Ich darf kein neues Record zuweisen, die Eigenschaften des Record selbst sollten aber weiter änderbar bleiben.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  D: TDisplayRecord;
begin
  D := Andorra.Display;
  D.Width := 800;
  D.Height := 600;
  D.BitDepth := ad32Bit;
  D.DisplayMode := dmFullscreen;
end;

Das sollte doch funktionieren, oder nicht?


--- edit ---
Habe mir mal den Link angeguckt und da steht:
Zitat:

Interestingly, the "with" version of the code WILL compile for both the TTestClassB and the TTestClassC:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
with testB.InnerRecord do //or "testC"
begin
  Name := 'Delphi';
end;


Das erklärt sich für mich dahingehend, dass er im with weiß, dass er den Getter() verwenden muss und somit implizit mein Beispiel oben erzeugt. Warum das dann unter XE2 jedoch nicht mehr funktioniert...