AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Opacity von Rectangle in Frame setzen zur Laufzeit geht nicht
Thema durchsuchen
Ansicht
Themen-Optionen

Opacity von Rectangle in Frame setzen zur Laufzeit geht nicht

Offene Frage von "jaenicke"
Ein Thema von xbkbk · begonnen am 12. Jan 2022 · letzter Beitrag vom 13. Jan 2022
Antwort Antwort
xbkbk

Registriert seit: 9. Jul 2012
Ort: 37083 Göttingen
61 Beiträge
 
Delphi 10.4 Sydney
 
#1

Opacity von Rectangle in Frame setzen zur Laufzeit geht nicht

  Alt 12. Jan 2022, 01:34
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;
Felix

Geändert von xbkbk (12. Jan 2022 um 01:41 Uhr)
  Mit Zitat antworten Zitat
xbkbk

Registriert seit: 9. Jul 2012
Ort: 37083 Göttingen
61 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 12. Jan 2022, 01:52
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)
Angehängte Dateien
Dateityp: rar frameopacityrectangletest.rar (27,6 KB, 4x aufgerufen)
Felix
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.431 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 12. Jan 2022, 10:36
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
xbkbk

Registriert seit: 9. Jul 2012
Ort: 37083 Göttingen
61 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 13. Jan 2022, 01:33
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?
Felix
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.016 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 13. Jan 2022, 02:09
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
969 Beiträge
 
Delphi 6 Professional
 
#6

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

  Alt 13. Jan 2022, 08:33
Hmm..

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....
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.574 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 13. Jan 2022, 10:34
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.
Die Instanz in Form1 kannst du mit Form1.Frame21 erreichen.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:54 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