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 Opacity von Rectangle in Frame setzen zur Laufzeit geht nicht (https://www.delphipraxis.net/209704-opacity-von-rectangle-frame-setzen-zur-laufzeit-geht-nicht.html)

xbkbk 12. Jan 2022 00:34

Opacity von Rectangle in Frame setzen zur Laufzeit geht nicht
 
Ich habe ein sehr merkwürdiges Problem, denn
Code:
Frame3.Rectangle1.Opacity:=1/6;
funktioniert zwar auf einer Form, aber nicht in einem Frame und ich verstehe nicht warum. Ich nutze Delphi 10.4.2 Community Edition.
An sich sollte der Code funktionieren, denn wenn ich im Objektinspektor den Opacity Wert modifiziere funktioniert die Darstellung problemlos, ebenso wie die Änderung auf einer Form problemlos funktioniert. Nur im Frame bekomme ich eine Zugriffsverletzung.

Kann das jemand reproduzieren oder mir verraten, was ich falsch mache oder warum / wie es (oder auch nicht) geht?

EDIT: Also genauer gesagt funktioniert auf einer Form
Code:
Form3.Rectangle1.Opacity:=1/6;
aber auf einem Frame halt nicht
Code:
Frame3.Rectangle1.Opacity:=1/6;

xbkbk 12. Jan 2022 00:52

AW: Opacity von Rectangle in Frame setzen zur Laufzeit geht nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab euch mal eine .rar von einem Beispielprojekt erstellt. Der Button auf der Form macht was er soll, aber der auf dem Frame nicht. (zumindest bei mir)

Uwe Raabe 12. Jan 2022 09:36

AW: Opacity von Rectangle in Frame setzen zur Laufzeit geht nicht
 
Zitat:

Zitat von xbkbk (Beitrag 1500481)
oder mir verraten, was ich falsch mache oder warum / wie es (oder auch nicht) geht?

Frame2 wird nirgendwo erzeugt.

Die Instanz in Form1 kannst du mit Form1.Frame21 erreichen.

Allerdings ist die Verwendung der globalen Variablen Form1 eher nicht zu empfehlen. Besser in Button1Click direkt Rectangle1 bzw. Frame21.Rectangle1 ansprechen.

xbkbk 13. Jan 2022 00:33

AW: Opacity von Rectangle in Frame setzen zur Laufzeit geht nicht
 
Ok Frame2 wird nicht erzeugt? Verstehe ich nicht. In meinem Beispiel habe ich ja direkt schon einen Frame zur Designtime auf die Form gezogen, daher ging ich (zumal der Frame ja auch angezeigt wird) davon aus, dass er auch erzeugt wird.

Zum Testen habe ich ihn nun auch zur Laufzeit erzeugt:
Code:
procedure TForm1.Button2Click(Sender: TObject);
var
  MyFrame: TFrame;
begin
  MyFrame := TFrame2.Create(Self);
  MyFrame.Parent := Self;
  MyFrame.Align := TAlignLayout.Client;


  if MyFrame is TFrame2 then
  begin
    TFrame2(MyFrame).Button1.OnClick(Self);
  end;

end;
was allerdings nichts an dem Problem ändert, dass ich eine Zugriffsverletzung bekomme.

Innerhalb des Frames habe ich nun aber etwas verändert:

Code:
procedure Dings;
begin
  Frame2.rectangle1.Opacity:=1/6;
end;

procedure TFrame2.Button1Click(Sender: TObject);
begin
self.rectangle1.Opacity:=1/6;
Dings;
end;
Wenn ich dort nun im Button also self statt einer Variable nutze funktioniert das ganze. Wenn ich allerdings in meiner procedure "Dings" genau das gleiche machen will funktioniert es nicht mehr. Warum ist das so?

himitsu 13. Jan 2022 01:09

AW: Opacity von Rectangle in Frame setzen zur Laufzeit geht nicht
 
Zitat:

Zitat von xbkbk (Beitrag 1500510)
Wenn ich dort .....

Den Debugger nehmen
und nachsehn was dort drin steht?

Vermutung: in Frame2 steht nicht das drin, was du denkst, weil DU es da nicht reingeschrieben hast.
Was aber auch richtig ist, denn wenn z.B. man den Frame zweimal erstellt, was soll da denn dann drinsteht?


Fazit: diese globalen Variablen sofort löschen und schauen wie man es richtig macht, ohne solchen globalen Mist.

HolgerX 13. Jan 2022 07:33

AW: Opacity von Rectangle in Frame setzen zur Laufzeit geht nicht
 
Hmm..

Zitat:

Zitat von xbkbk (Beitrag 1500510)
Delphi-Quellcode:
[CODE]
procedure Dings;
begin
  Frame2.rectangle1.Opacity:=1/6;
end;

procedure TFrame2.Button1Click(Sender: TObject);
begin
self.rectangle1.Opacity:=1/6;
Dings;
end;
Wenn ich dort nun im Button also self statt einer Variable nutze funktioniert das ganze. Wenn ich allerdings in meiner procedure "Dings" genau das gleiche machen will funktioniert es nicht mehr. Warum ist das so?

Deine procedure Dings ist keine Methode des Frames, woher sollte es dann die 'Variable' Frame2 bzw. 'self' kennen....

jaenicke 13. Jan 2022 09:34

AW: Opacity von Rectangle in Frame setzen zur Laufzeit geht nicht
 
Zitat:

Zitat von xbkbk (Beitrag 1500510)
Ok Frame2 wird nicht erzeugt? Verstehe ich nicht. In meinem Beispiel habe ich ja direkt schon einen Frame zur Designtime auf die Form gezogen, daher ging ich (zumal der Frame ja auch angezeigt wird) davon aus, dass er auch erzeugt wird.

Das wird er ja auch, aber das hat nichts (!) mit der globalen Variable Frame2 zu tun. Der Frame liegt wie Uwe schon schrieb als Frame21 auf deinem Formular.
Zitat:

Zitat von Uwe Raabe (Beitrag 1500488)
Die Instanz in Form1 kannst du mit Form1.Frame21 erreichen.



Alle Zeitangaben in WEZ +1. Es ist jetzt 03:52 Uhr.

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