Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Verhalten von Align in D2006 und D2007 geändert. (https://www.delphipraxis.net/92695-verhalten-von-align-d2006-und-d2007-geaendert.html)

MaBuSE 24. Mai 2007 15:12


Verhalten von Align in D2006 und D2007 geändert.
 
Hallo,
In der Komponente TControl (und allen davon abgeleiteten Komponenten) hat sich das Verhalten von Align geändert.

Anleitung zum Reproduzieren des Features:
  • eine neue Anwendung in z.B. Delphi 7 erstellen
  • ein TMemo auf das leere Form legen
  • Memo1.Align im Objektinspektor auf alClient setzten -> Das Memo füllt das ganze Form aus.
  • Memo1.Align im Objektinspektor auf alNone setzten -> Das Memo füllt immer noch das ganze Form aus.
In Delphi 2006 oder 2007:
  • eine neue Anwendung in z.B. Delphi 2007 für Win32 erstellen
  • ein TMemo auf das leere Form legen
  • Memo1.Align im Objektinspektor auf alClient setzten -> Das Memo füllt das ganze Form aus.
  • Memo1.Align im Objektinspektor auf alNone setzten -> Das Memo hat wieder die ursprüngliche Position und Größe.
Die alten Werte sind in den readonly Eigenschaften ExplicitLeft, ExplicitTop, ExplicitWidth und ExplicitHeight gespeichert.

Die ExplicitLeft Eigenschaft wird dem ein oder anderen durch die Fehlermeldung "property ExplicitLeft not found" bekannt sein.
(bzw: "Im Projekt Project1.exe ist eine Exception der Klasse EReadError mit der Meldung 'Eigenschaft ExplicitLeft existiert nicht.' aufgetreten.")
Die ExplicitLeft wurde in D2006 eingeführt.

Die Align Funktionalität ist in der Komponente TControl gekapselt.

In D7 wird in SetAlign folgendes gemacht:
Delphi-Quellcode:
...
    if ... then
        SetBounds(Left, Top, Height, Width)
      else
        AdjustSize;
...
In D2007 wird dort auf ExplicitXXX zugegriffen.
Delphi-Quellcode:
...
      if ... then
        SetBounds(Left, Top, Height, Width)
      else if (OldAlign <> alNone) and (Value = alNone) then
        SetBounds(FExplicitLeft, FExplicitTop, FExplicitWidth, FExplicitHeight)
      else
        AdjustSize;
...
Die ExplicitXXX Properties werden in D2007 in SetLeft, SetTop, SetWidth und SetHeight explizit gesetzt.
Delphi-Quellcode:
...
procedure TControl.SetLeft(Value: Integer);
begin
  SetBounds(Value, FTop, FWidth, FHeight);
  Include(FScalingFlags, sfLeft);
  if csReading in ComponentState then
    FExplicitLeft := FLeft;
end;
...
Im Vergleich dazu die D7 Source:
Delphi-Quellcode:
...
procedure TControl.SetLeft(Value: Integer);
begin
  SetBounds(Value, FTop, FWidth, FHeight);
  Include(FScalingFlags, sfLeft);
end;
...
Es ist also kein Bug, sondern ein Feature !!!

Es sollten alle Programmstellen bearbeitet werden, in denen ein
Delphi-Quellcode:
Align := alClient;
Align := alNone;
gemacht wird, um das Control der Containergröße anzupassen. (z.B. in diversen Freeware Komponenten)

Viele Grüße
MaBuSE

SirThornberry 24. Mai 2007 15:23

Re: Verhalten von Align in D2006 und D2007 geändert.
 
Delphi-Quellcode:
Align := alClient;
Align := alNone;
hat auch schon in D7 nicht funktioniert weil die größe erst aktuallisiert wird wenn wenn das Control dargestellt wird (zumindest meine ich mich daran erinnern zu können).

MaBuSE 24. Mai 2007 16:14

Re: Verhalten von Align in D2006 und D2007 geändert.
 
Zitat:

Zitat von SirThornberry
Delphi-Quellcode:
Align := alClient;
Align := alNone;
hat auch schon in D7 nicht funktioniert weil die größe erst aktuallisiert wird wenn wenn das Control dargestellt wird (zumindest meine ich mich daran erinnern zu können).

In der Komponente TMSNPopUp ( http://homepages.borland.com/torry/appearence.htm#7282 ) steht folgendes und das funktioniert auch unter Delphi 7 problemlos.
Delphi-Quellcode:
...
  // imgGradient ist vom Typ TImage
  imgGradient.Align := alClient;
  imgGradient.Align := alNone;
...

r_kerber 26. Mai 2007 17:43

Re: Verhalten von Align in D2006 und D2007 geändert.
 
Zitat:

Zitat von MaBuSE
Es ist also kein Bug, sondern ein Feature !!!

Ein Feature, daß mich zwei Tage Fehlersuche gekostet hat, und bei dem ich noch drei andere Entwickler "genervt" habe. Ich sehe keinen Grund, für diese Verhaltensänderung! Es wurde doch immer gesagt, dass D7-Komponenten auch unter D2007 laufen sollen...

Bernhard Geyer 26. Mai 2007 18:01

Re: Verhalten von Align in D2006 und D2007 geändert.
 
Zitat:

Zitat von r_kerber
Ein Feature, daß mich zwei Tage Fehlersuche gekostet hat, und bei dem ich noch drei andere Entwickler "genervt" habe. Ich sehe keinen Grund, für diese Verhaltensänderung! Es wurde doch immer gesagt, dass D7-Komponenten auch unter D2007 laufen sollen...

2 Tage. Das ist doch nichts für ein neues System. Wenn ich dagegenhalt wieviel Tags mich jede neue Windows-Version, Adobe-SW-Version micht immer kosten wäre ich über 2 Tage sehr froh.

Was mich interessieren würde ist das Warum? Was verspricht man sich mit diesem neuen Feature?

jbg 26. Mai 2007 18:07

Re: Verhalten von Align in D2006 und D2007 geändert.
 
Wahrscheinlich haben sich ein paar Leute bei CodeGear (damals noch Borland) beklagt, dass wenn sie die Align-Eigenschaft wieder zurücksetzen, das Control nicht mehr auf seine Ursprungsgröße schrumpft. Das brachte uns dann die ExplicitLeft/Top/Width/Height Eigenschaften. Diese machen es den Komponentenhersteller recht schwer Delphi 7 zu unterstützen, da ein Formular das einmal mit BDS 2006/2007 angefasst wurde nicht ohne Handarbeit in Delphi 7 funktioniert, weil D7 diese Eigenschaften nicht kennt. (Bei der Entwicklung der DDevExtensions konnte ich ein Lied davon singen).

Bernhard Geyer 26. Mai 2007 18:16

Re: Verhalten von Align in D2006 und D2007 geändert.
 
Zitat:

Zitat von jbg
Diese machen es den Komponentenhersteller recht schwer Delphi 7 zu unterstützen, da ein Formular das einmal mit BDS 2006/2007 angefasst wurde nicht ohne Handarbeit in Delphi 7 funktioniert, weil D7 diese Eigenschaften nicht kennt.

Das ist aber eine generelles Problem der Altkompatiblität und persistenten Formulareigenschaften. Ein einmal mit Delphi 6 erzeugtes Formular kann so ohne weiteres auch nicht mehr unter Delphi 4 geöffnet werden. Ein unter VS.NET 2005 angepaßtes Formular auch nicht mehr unter VS.NET 2003/2002.

Für diese gesonderten Fall wäre ein EnableExplizitSize-Property schön gewesen das defaultmäßig auf False steht und default-Value auch False hat. Ist dieses Falls werden die Explizit-Properties auch nicht geschrieben.

r_kerber 26. Mai 2007 18:36

Re: Verhalten von Align in D2006 und D2007 geändert.
 
Zitat:

Zitat von Bernhard Geyer
Was mich interessieren würde ist das Warum? Was verspricht man sich mit diesem neuen Feature?

Mich auch.
Zitat:

Zitat von Bernhard Geyer
2 Tage. Das ist doch nichts für ein neues System. Wenn ich dagegenhalt wieviel Tags mich jede neue Windows-Version, Adobe-SW-Version micht immer kosten wäre ich über 2 Tage sehr froh.

Für eine "klitzekleine" Komponente ist das viel. Ich wage gar nicht daran zu denken, was bei einem Programm mit tausenden Zeilen Quellcode passiert. Und das dann auch noch bei Projekt-Druck.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz