![]() |
Delphi-Version: XE6
Objecteigenschaften während der Laufzeit ändern
Liste der Anhänge anzeigen (Anzahl: 1)
Ich möchte in FireMonkey die Eigeschaften von einem Expander ändern z.B. StyleLookup oder Width. Die Expander werden dynamisch während der Laufzeit angelegt. Ich fange leider erst gerade mit objectorientierter Programmierung an und bekomme das Ändern der Eigenschaften von diesem Objecten nicht hin. Das Anlegen und anzeigen der Objecte geht das Ändern nicht. Mein Quellcode habe ich angehängt.
Delphi-Quellcode:
TExpanderNeu = class(TExpander)
private public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure groß(Sender: TObject); procedure klein(Sender: TObject); end; var Form1: TForm1; y, i,j,x,test: integer; progPfad,datei2 : string; ExpanderArray: array of TExpanderNeu; implementation {$R *.fmx} constructor TExpanderNeu.Create; begin inherited; end; destructor TExpanderNeu.Destroy; begin inherited; end; procedure TExpanderNeu.groß; begin StyleLookup := 'expanderstyle'; Width := 300; end; procedure TExpanderNeu.klein(Sender: TObject); begin (Sender as TExpanderNeu).BeginUpdate; (Sender as TExpanderNeu).StyleLookup := 'expanderstyleneu'; (Sender as TExpanderNeu).Width := 125; (Sender as TExpanderNeu).EndUpdate; end; procedure createBild(AOwner: TFmxObject); var newBild :Timage; begin newBild := TImage.Create(AOwner); with newBild do begin parent := AOwner; Bitmap.CreateFromFile(Pchar(Progpfad+'Bilder\Lueftung.png')); position.X := 222; position.Y := -24; height := 125; width := 78; end; end; procedure createExpanderNeu(AOwner: TFmxObject; labelText : String; posX, posY, hoehe, breite,i : integer); var Expander : TExpanderNeu; begin SetLength(ExpanderArray,Length(ExpanderArray)+1); ExpanderArray[i] := TExpanderNeu.Create(AOwner); with Expander do begin ExpanderArray[i].Parent := Form1.FlowLayout2; ExpanderArray[i].HitTest := true; ExpanderArray[i].Text := labelText; ExpanderArray[i].Cursor := crHandPoint; ExpanderArray[i].height := hoehe; ExpanderArray[i].width := breite; end; createBild(ExpanderArray[i]); end; function TForm1.panelzoom():boolean; begin if y <> 99 then begin i := 1; y := 99; end; if i = 1 then begin FloatAnimation2.Enabled := false; FloatAnimation1.Enabled := true; imagecontrol7.LoadFromFile(Progpfad+'Bilder\Icons\Pfeil_links_schwarz.png'); i := 0; end else begin FloatAnimation1.Enabled := false; FloatAnimation2.Enabled := true; imagecontrol7.LoadFromFile(Progpfad+'Bilder\Icons\Pfeil_Rechts_schwarz.png'); i := 1; end; end; function TForm1.buttonzoom():boolean; var panel : TExpanderNeu; begin Waermepumpe.StyleLookup := 'expanderstyleneu'; Waermepumpe.Width := 125; solar.StyleLookup := 'expanderstyleneu'; solar.Width := 125; expander3.StyleLookup := 'expanderstyleneu'; expander3.Width := 125; lueftung.StyleLookup := 'expanderstyleneu'; lueftung.Width := 125; end; function TForm1.buttonzoomout():boolean; begin Waermepumpe.StyleLookup := 'expanderstyle'; Waermepumpe.Width := 300; solar.StyleLookup := 'expanderstyle'; solar.Width := 300; expander3.StyleLookup := 'expanderstyle'; expander3.Width := 300; lueftung.StyleLookup := 'expanderstyle'; lueftung.Width := 300; end; procedure TForm1.FormCreate(Sender: TObject); var i : integer; text: array[1..10]of string; begin ProgPfad := ExpandFileName('KPN.exe'); delete(ProgPfad,length(ProgPfad)-6,256); text[1]:= 'Wärmepumpe'; text[2]:= 'Solar'; text[3]:= 'Lüftung'; text[4]:= 'Heizkessel'; text[5]:= 'Speicher'; SetLength(ExpanderArray,0); for i := 1 to 5 do begin createExpanderNeu(Image6,Text[i], 222, -24, 125, 300,i); end; label26.Text := IntToStr(Flowlayout2.ChildrenCount); end; procedure TForm1.FormResize(Sender: TObject); var test : TExpanderNeu; begin if y <> 99 then begin i := 1; y := 99; end; if Form1.Width < 300*2.2 then begin test.klein(ExpanderArray[1]); buttonzoom; if (ProduktMeneu.Width > 200) and (i = 1) then begin panelzoom(); Label18.Visible := false; i := 0; end; end else begin buttonzoomout; if (ProduktMeneu.Width < 200) and (i = 0) then begin panelzoom(); Label18.Visible := true; i := 1; end; end; end; |
AW: Objecteigenschaften während der Laufzeit ändern
Hallo zusammen,
Zitat:
Ich vermute einmal, dass er beim FormResize eine Exception wirft. Ist das richtig? |
AW: Objecteigenschaften während der Laufzeit ändern
Das ist richtig.
|
AW: Objecteigenschaften während der Laufzeit ändern
Hallo zusammen,
Zitat:
Du versuchst auf ein Objekt zuzugreifen, welches Du noch gar nicht erstellt hast.
Delphi-Quellcode:
oder
procedure TForm1.FormResize(Sender: TObject);
var test : TExpanderNeu; begin test := TExpanderNeu.Create(Self); //<-- Zeile hinzufügen if y <> 99 then begin i := 1; y := 99; end; if Form1.Width < 300*2.2 then begin test.klein(ExpanderArray[1]); buttonzoom; if (ProduktMeneu.Width > 200) and (i = 1) then begin panelzoom(); Label18.Visible := false; i := 0; end; end else begin buttonzoomout; if (ProduktMeneu.Width < 200) and (i = 0) then begin panelzoom(); Label18.Visible := true; i := 1; end; end; test.Free //<-- Zeile hinzufügen end; ExpanderArray[1].klein(ExpanderArray[1]) |
AW: Objecteigenschaften während der Laufzeit ändern
Bei jedem Ändern der Formgröße einen neuen Expander?
|
AW: Objecteigenschaften während der Laufzeit ändern
Hallo zusammen,
Zitat:
Aber da man sieht, dass das Programm doch eher an eine Rohfassung erinnert, wollte ich nur den bestehenden Code so ändern, dass man auch sieht, warum hier der Fehler auftritt. Die zweite Version ist definitiv besser, obwohl ich persönlich die Funktionen .Klein und .Gross ohne Sender-Parameter erstellt hätte. |
AW: Objecteigenschaften während der Laufzeit ändern
Die Funktion ist, ich erstelle beim starten des Programms eine Liste von Expander-Elementen mit einer Breite von 300. Bei Verkleinerung des Formulars soll ab einer bestimmten Breite alle Expander-Elemente auf 125 verkleinert werden und ein anderes StyleLookup zugewiesen werden. Aus diesem Grund habe ich ein ExpanderArray angelegt so dass ich über eine Schleife alle Expander-Elemente verkleinern kann.
|
AW: Objecteigenschaften während der Laufzeit ändern
Hallo zusammen,
Zitat:
Zitat:
Delphi-Quellcode:
Wenn Du noch den Sender-Parameter in der .klein- und .gross- Procedure entfernst, dann reicht >>ExpanderArray[zaehler].klein;<< als Zeile in der Schleife
for zaehler := 0 to Length(ExpanderArray) - 1 do
begin ExpanderArray[zaehler].klein(ExpanderArray[zaehler]) end; |
AW: Objecteigenschaften während der Laufzeit ändern
Hallo erst einmal vielen Dank. Das Aufrufen der TExpanderNeu.klein Procedure funktioniert. Ich komme aber in der Methode nicht weiter.
Delphi-Quellcode:
Der Quellcode wirft eine Exeption. Ich bin wie gesagt Anfänger im Bereich der Objectorientierung.
procedure TExpanderNeu.klein(Sender: TObject);
begin BeginUpdate; StyleLookup := 'expanderstyleneu'; Width := 125; EndUpdate; end; |
AW: Objecteigenschaften während der Laufzeit ändern
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:31 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-2025 by Thomas Breitkreuz