Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Objecteigenschaften während der Laufzeit ändern (https://www.delphipraxis.net/183055-objecteigenschaften-waehrend-der-laufzeit-aendern.html)

Torwein 8. Dez 2014 13:33

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;

BadenPower 8. Dez 2014 14:23

AW: Objecteigenschaften während der Laufzeit ändern
 
Hallo zusammen,
Zitat:

Zitat von Torwein (Beitrag 1282615)
Das Anlegen und anzeigen der Objecte geht das Ändern nicht.

Wann geht das ändern der Eigenschaften nicht?

Ich vermute einmal, dass er beim FormResize eine Exception wirft. Ist das richtig?

Torwein 8. Dez 2014 14:31

AW: Objecteigenschaften während der Laufzeit ändern
 
Das ist richtig.

BadenPower 8. Dez 2014 14:40

AW: Objecteigenschaften während der Laufzeit ändern
 
Hallo zusammen,
Zitat:

Zitat von Torwein (Beitrag 1282625)
Das ist richtig.

Das ist jetzt nicht böse gemeint, aber schreib das doch auch bitte und halte solch wichtige Informationen nicht zurück.


Du versuchst auf ein Objekt zuzugreifen, welches Du noch gar nicht erstellt hast.

Delphi-Quellcode:
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;
oder

ExpanderArray[1].klein(ExpanderArray[1])

mkinzler 8. Dez 2014 14:42

AW: Objecteigenschaften während der Laufzeit ändern
 
Bei jedem Ändern der Formgröße einen neuen Expander?

BadenPower 8. Dez 2014 14:53

AW: Objecteigenschaften während der Laufzeit ändern
 
Hallo zusammen,
Zitat:

Zitat von mkinzler (Beitrag 1282628)
Bei jedem Ändern der Formgröße einen neuen Expander?

Das habe ich mich auch gefragt.
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.

Torwein 8. Dez 2014 14:56

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.

BadenPower 8. Dez 2014 15:16

AW: Objecteigenschaften während der Laufzeit ändern
 
Hallo zusammen,

Zitat:

Zitat von Torwein (Beitrag 1282632)
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.

Das war schon klar.

Zitat:

Zitat von Torwein (Beitrag 1282632)
Aus diesem Grund habe ich ein ExpanderArray angelegt so dass ich über eine Schleife alle Expander-Elemente verkleinern kann.

In der FormResize kannst Du die Variable "test" wegschmeisen und per Schleife die Funktion .klein oder .gross direkt aufrufen.

Delphi-Quellcode:
for zaehler := 0 to Length(ExpanderArray) - 1 do
 begin
   ExpanderArray[zaehler].klein(ExpanderArray[zaehler])
 end;
Wenn Du noch den Sender-Parameter in der .klein- und .gross- Procedure entfernst, dann reicht >>ExpanderArray[zaehler].klein;<< als Zeile in der Schleife

Torwein 8. Dez 2014 15:39

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:
procedure TExpanderNeu.klein(Sender: TObject);
begin
  BeginUpdate;
    StyleLookup := 'expanderstyleneu';
    Width := 125;
  EndUpdate;
end;
Der Quellcode wirft eine Exeption. Ich bin wie gesagt Anfänger im Bereich der Objectorientierung.

mkinzler 8. Dez 2014 15:48

AW: Objecteigenschaften während der Laufzeit ändern
 
Zitat:

Der Quellcode wirft eine Exeption.
Und welchen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 Uhr.
Seite 1 von 3  1 23      

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