Delphi-PRAXiS
Seite 2 von 3     12 3      

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 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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 Uhr.
Seite 2 von 3     12 3      

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