AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Objecteigenschaften während der Laufzeit ändern
Thema durchsuchen
Ansicht
Themen-Optionen

Objecteigenschaften während der Laufzeit ändern

Ein Thema von Torwein · begonnen am 8. Dez 2014 · letzter Beitrag vom 10. Dez 2014
Antwort Antwort
Seite 1 von 3  1 23      
Torwein

Registriert seit: 6. Dez 2011
11 Beiträge
 
#1

Objecteigenschaften während der Laufzeit ändern

  Alt 8. Dez 2014, 14:33
Delphi-Version: XE6
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;
Angehängte Dateien
Dateityp: pas Haupfenster.pas (7,6 KB, 2x aufgerufen)

Geändert von Torwein ( 8. Dez 2014 um 15:12 Uhr)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#2

AW: Objecteigenschaften während der Laufzeit ändern

  Alt 8. Dez 2014, 15:23
Hallo zusammen,
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?
  Mit Zitat antworten Zitat
Torwein

Registriert seit: 6. Dez 2011
11 Beiträge
 
#3

AW: Objecteigenschaften während der Laufzeit ändern

  Alt 8. Dez 2014, 15:31
Das ist richtig.
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#4

AW: Objecteigenschaften während der Laufzeit ändern

  Alt 8. Dez 2014, 15:40
Hallo zusammen,
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])

Geändert von BadenPower ( 8. Dez 2014 um 15:42 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Objecteigenschaften während der Laufzeit ändern

  Alt 8. Dez 2014, 15:42
Bei jedem Ändern der Formgröße einen neuen Expander?
Markus Kinzler
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#6

AW: Objecteigenschaften während der Laufzeit ändern

  Alt 8. Dez 2014, 15:53
Hallo zusammen,
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.
  Mit Zitat antworten Zitat
Torwein

Registriert seit: 6. Dez 2011
11 Beiträge
 
#7

AW: Objecteigenschaften während der Laufzeit ändern

  Alt 8. Dez 2014, 15:56
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.
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#8

AW: Objecteigenschaften während der Laufzeit ändern

  Alt 8. Dez 2014, 16:16
Hallo zusammen,

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.

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
  Mit Zitat antworten Zitat
Torwein

Registriert seit: 6. Dez 2011
11 Beiträge
 
#9

AW: Objecteigenschaften während der Laufzeit ändern

  Alt 8. Dez 2014, 16:39
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Objecteigenschaften während der Laufzeit ändern

  Alt 8. Dez 2014, 16:48
Zitat:
Der Quellcode wirft eine Exeption.
Und welchen?
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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:30 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