Delphi-PRAXiS

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?

Torwein 8. Dez 2014 15:56

AW: Objecteigenschaften während der Laufzeit ändern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe die Screenshot angehängt.

BadenPower 8. Dez 2014 16:00

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


Was hast Du an Deinem Quellcode jetzt verändert?

Stell das ganze Projekt am besten nochmals ein.

Torwein 8. Dez 2014 16:15

AW: Objecteigenschaften während der Laufzeit ändern
 
Delphi-Quellcode:
unit Haupfenster;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
  FMX.Layouts, FMX.Ani, FMX.Objects, Contnrs;

type
  TForm1 = class(TForm)
    StyleBook1: TStyleBook;
    ProduktMeneu: TPanel;
    Oben: TPanel;
    Seite: TPanel;
    FlowLayout2: TFlowLayout;
    Waermepumpe: TExpander;
    Solar: TExpander;
    Expander3: TExpander;
    Lueftung: TExpander;
    Start: TPanel;
    Unten: TPanel;
    ImageControl7: TImageControl;
    Image1: TImage;
    FloatAnimation1: TFloatAnimation;
    FloatAnimation2: TFloatAnimation;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Image2: TImage;
    Image3: TImage;
    Label13: TLabel;
    Label14: TLabel;
    Image4: TImage;
    Image5: TImage;
    Image6: TImage;
    Label15: TLabel;
    Image7: TImage;
    Label16: TLabel;
    Image8: TImage;
    Label17: TLabel;
    Label18: TLabel;
    Menue: TPanel;
    FloatAnimation3: TFloatAnimation;
    FloatAnimation4: TFloatAnimation;
    Image9: TImage;
    Label19: TLabel;
    Image11: TImage;
    Label21: TLabel;
    Image12: TImage;
    Label22: TLabel;
    Image13: TImage;
    Label23: TLabel;
    Image10: TImage;
    Label20: TLabel;
    Image14: TImage;
    Label24: TLabel;
    Image15: TImage;
    Label25: TLabel;
    ImageControl1: TImageControl;
    ImageControl2: TImageControl;
    ImageControl3: TImageControl;
    ImageControl4: TImageControl;
    ImageControl5: TImageControl;
    Image16: TImage;
    Image17: TImage;
    Label26: TLabel;
    Expander1: TExpander;
    Image18: TImage;
    procedure FormResize(Sender: TObject);
    procedure ImageControl7Click(Sender: TObject);
    function panelzoom():boolean;
    function buttonzoom():boolean;
    function buttonzoomout():boolean;
    procedure Image4Click(Sender: TObject);
    procedure Image8Click(Sender: TObject);
    procedure ImageControl1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

 
  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ß(Sender: TObject);
begin
  StyleLookup := 'expanderstyle';
  Width := 300;
end;


procedure TExpanderNeu.klein;
begin
  BeginUpdate;
    StyleLookup := 'expanderstyleneu';
    Width := 125;
  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;
  AOwner: TFmxObject;
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
zaehler : integer;
begin
  if y <> 99 then begin
    i := 1;
    y := 99;
  end;
  if Form1.Width < 300*2.2 then begin
    for zaehler := 0 to Length(ExpanderArray) - 1 do
    begin
        ExpanderArray[zaehler].klein(ExpanderArray[zaehler])
    end;
    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;

procedure TForm1.Image4Click(Sender: TObject);
begin
  start.Enabled :=false;
  start.Visible := false;
end;

procedure TForm1.Image8Click(Sender: TObject);
begin
if x <> 99 then begin
    j := 1;
    x := 99;
  end;
  if j = 1 then begin
    FloatAnimation4.Enabled := false;
    FloatAnimation3.Enabled := true;
    j := 0;
  end else begin
    FloatAnimation3.Enabled := false;
    FloatAnimation4.Enabled := true;
    j := 1;
  end;
end;

procedure TForm1.ImageControl1Click(Sender: TObject);
var
Expander : TExpanderNeu;
begin
  if test <> 1 then begin
    imagecontrol1.LoadFromFile(Progpfad+'Bilder\Icons\icon-biomasse-xl.png');
    waermepumpe.Visible := true;
    solar.Visible := false;
    ExpanderArray[i].Destroy;
//    solar.Destroy;
//  expander3.Enabled := false;
    lueftung.Visible := false;
//    lueftung.Destroy;
    test :=1;
    flowlayout2.Width :=0;
  end else begin
    imagecontrol1.LoadFromFile(Progpfad+'Bilder\Icons\icon-biomasse-weiss-xl.png');
    waermepumpe.Visible := true;
    solar.Visible := true;
//  expander3.Enabled := false;
    lueftung.Visible := true;
    test :=2;
    flowlayout2.Width :=0;
  end;
end;

procedure TForm1.ImageControl7Click(Sender: TObject);
begin
  panelzoom()
end;

end.
Ich denke das der Teil des Programms nicht ganz in Ordnung ist
Delphi-Quellcode:
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;
Delphi-Quellcode:
SetLength(ExpanderArray,0);
    for i := 1 to 5 do begin
      createExpanderNeu(image6,Text[i], 222, -24, 125, 300,i);
    end;
Das Programm lässt sich compilieren und funktioniert außer dem Problem mit dem ändern der Eigenschaften. Wenn ich das Programm schließe kommt aber eine Exeption. Kommentiere ich den Teil createExpanderNeu(image6,Text[i], 222, -24, 125, 300,i); aus kommt keine Exeption. Ich vermute das das alles miteinander zusammenhängt. Ich bin echt ratlos.

BadenPower 8. Dez 2014 16:51

AW: Objecteigenschaften während der Laufzeit ändern
 
Mach das einmal so:

Delphi-Quellcode:
procedure createExpanderNeu(AOwner: TFmxObject; labelText : String; posX, posY, hoehe, breite,i : integer);
begin
  SetLength(ExpanderArray,Length(ExpanderArray)+1);
  ExpanderArray[i] := TExpanderNeu.Create(AOwner);

  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;

  createBild(ExpanderArray[i]);
end;

Torwein 8. Dez 2014 18:02

AW: Objecteigenschaften während der Laufzeit ändern
 
Das hat nichts geändert. Ich denke das ganze hat mit der Klassendeklaration was zu tun.
Delphi-Quellcode:
TExpanderNeu = class(TExpander)
    private
    public
      constructor Create(AOwner: TComponent); override;
      destructor Destroy; override;
      procedure groß(Sender: TObject);
      procedure klein(Sender: TObject);
  end;

constructor TExpanderNeu.Create;
begin
  inherited;
end;
Wenn ich hier constructor Create(AOwner: TComponent); override; den Teil (AOwner: TComponent); override; weglasse bekomme ich hier

Delphi-Quellcode:
constructor TExpanderNeu.Create;
begin
  inherited;
end;
eine Fehlermeldung "inkompatible Typen"

wenn ich das drin lasse weis ich nicht was ich hier

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

procedure TForm1.FormCreate(Sender: TObject);
var
  i : integer;
  text: array[1..10]of string;
  AOwner: TFmxObject;
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;
für einen Parameter für "image6" nehmen soll

Torwein 9. Dez 2014 06:06

AW: Objecteigenschaften während der Laufzeit ändern
 
Ich habe es hinbekommen

Das Problem:
Delphi-Quellcode:
etLength(ExpanderArray,0);
    for i := 1 to 6 do begin
      createExpanderNeu(FlowLayout2,Text[1], 222, -24, 125, 300,i);
    end;
Die Lösung:
Delphi-Quellcode:
etLength(ExpanderArray,0);
    for i := 0 to 5 do begin
      createExpanderNeu(FlowLayout2,Text[i+1], 222, -24, 125, 300,i);
    end;
Das Füllen des Array muss mit 0 beginnen nicht mit 1

himitsu 9. Dez 2014 07:53

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

Delphi-Quellcode:
SetLength(ExpanderArray, 0);
for i := 1 to 6 do
  createExpanderNeu(FlowLayout2,Text[1], 222, -24, 125, 300,i);
Delphi-Quellcode:
SetLength(ExpanderArray, 0);
for i := 0 to 5 do
  createExpanderNeu(FlowLayout2,Text[i+1], 222, -24, 125, 300,i);

Warum nicht so?
Delphi-Quellcode:
SetLength(ExpanderArray, 0);
for i := 1 to 6 do
  createExpanderNeu(FlowLayout2,Text[i], 222, -24, 125, 300,i-1);
Bzw., stimmt der letzte Parameter überhaupt?
Zitat:

Delphi-Quellcode:
SetLength(ExpanderArray,Length(ExpanderArray)+1);
ExpanderArray[i] := TExpanderNeu.Create(AOwner);

Warum SetLength bezogen auf das Array, aber beim Zugriff auf das Array plötzlich ein anderer/fremder Index?

Warum gibt es da soviele globale Variablen?
Wenn die/einige wirklich global sein müssen, warum dann mit so nichtssagenden Namen?

i und j scheinen an manchen Stellen nur zwei Werte zu haben (0 und 1).
Sieht das nicht eher nach einem Boolean aus?

BadenPower 9. Dez 2014 09:00

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

und das ist natürlich genau so tötlich:
Delphi-Quellcode:
   ExpanderArray[i].Parent := Form1.FlowLayout2;

Wenn Du eine neue Instanz der Form anlegst, dann heisst diese nicht mehr "Form1".

Sir Rufo 9. Dez 2014 09:03

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

Zitat von BadenPower (Beitrag 1282721)
Hallo zusammen,

und das ist natürlich genau so tötlich:
Delphi-Quellcode:
   ExpanderArray[i].Parent := Form1.FlowLayout2;

Wenn Du eine neue Instanz der Form anlegst, dann heisst diese nicht mehr "Form1".

Da sagen wir doch schon gar nichts mehr zu ... der große Teil der Variablen ist ja auch global deklariert. Mehr als eine Instanz darf es von der Form sowieso nicht geben, sonst zündet da die Saturn-Rakete ;)

Torwein 9. Dez 2014 11:48

AW: Objecteigenschaften während der Laufzeit ändern
 
Erst einmal vielen Dank für Die Anregungen. Wie schon erwähnt bin ich absoluter Neuling was Objektorientierung angeht. Ich weis nicht wie man das

ExpanderArray[i].Parent := Form1.FlowLayout2;

besser abbildet :oops:. Bei den globalen Variablen bin ich am bereinigen. Ich bräuchte da aber ein paar Tipps wie man das besser abbilden kann.

BadenPower 9. Dez 2014 12:03

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

zuersteinmal setzt Du "procedure createExpanderNeu()" als procedure der TForm.

Delphi-Quellcode:
type
  TForm1 = class(TForm)
   ....
   private
    FExpanderArray: array of TExpanderNeu;
    procedure createExpanderNeu(Parameterliste);
   public
Natürlich musst Du nun die Klasse TExpanderNeu vor die Deklaration von TForm1 setzen und die globale Variable ExpanderArray entfernen und durch FExpanderArray ersetzen.

Delphi-Quellcode:
procedure TForm1.createExpanderNeu(AOwner: TFmxObject; labelText : String; posX, posY, hoehe, breite : integer);
var
  liNewIndex: Integer;
begin

  liNewIndex := Length(ExpanderArray);
  SetLength(FExpanderArray, liNewIndex + 1);
  FExpanderArray[liNewIndex ] := TExpanderNeu.Create(AOwner);

  FExpanderArray[liNewIndex ].Parent := FlowLayout2;
  FExpanderArray[liNewIndex ].HitTest := true;
  FExpanderArray[liNewIndex ].Text := labelText;
  FExpanderArray[liNewIndex ].Cursor := crHandPoint;
  FExpanderArray[liNewIndex ].height := hoehe;
  FExpanderArray[liNewIndex ].width := breite;

  createBild(FExpanderArray[liNewIndex]);
end;
Ich habe in den Parametern der Prozedur das "i" herausgenommen, da es nun zu keinen Missverständnissen kommen kann.

Torwein 9. Dez 2014 13:58

AW: Objecteigenschaften während der Laufzeit ändern
 
Danke für die Info, ich werde das mal testen und berichte ob ich damit klar gekommen bin :wink:

Torwein 10. Dez 2014 12:14

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

ich hätte hier noch eine Frage. Wie ist das gemeint "die globale Variable ExpanderArray entfernen und durch FExpanderArray ersetzen."?

Das habe ich nicht verstanden.

BadenPower 10. Dez 2014 12:41

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

Zitat:

Zitat von Torwein (Beitrag 1282878)
Wie ist das gemeint "die globale Variable ExpanderArray entfernen und durch FExpanderArray ersetzen."?

Delphi-Quellcode:
var
  Form1: TForm1;
  y, i,j,x,test: integer;
  progPfad,datei2 : string;
  ExpanderArray: array of TExpanderNeu;

implementation

{$R *.fmx}
Die hier deklarierten Variabeln sind "globale Variabeln", welche in jedem Fenster einer Anwendung bzw. in der gesamten Anwendung gültig sind.

Dort gehört aber nur das hin, was undedingt auch wirklich sein muss.
Also raus mit "y", "i","j","x","test", "progPfad","datei2" und "ExpanderArray".

Statt dessen entfernst Du diese globale Deklarationen und setzt sie in die Typ-Deklaration in der Form. Dann ist die Variable weiterhin in jeder Instanz der Form gültig, aber kann nicht durch eine weitere Instanz des Fensters oder von irgendetwas, was den gleichen globalen Variabelnamen benutzt, überschrieben werden.

Du weisst ja nicht, ob eine Komponente zufällig eine globale Variable mit diesem Namen auch anspricht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:20 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