Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Formular zur Laufzeit gestalten (https://www.delphipraxis.net/178956-formular-zur-laufzeit-gestalten.html)

LarsSchwencke 5. Feb 2014 14:49


Formular zur Laufzeit gestalten
 
Hallo,

ein Formular einer VCL-Formularanwendung(Unit1) möchte ich zur Laufzeit gestalten.
Dazu habe ich eine Unit2 erstellt, in der die Gestaltung beschrieben ist.
Ob man das so macht weiß ich nicht, vielleicht kennt ja jemand eine besse Lösung.

Hier der Quellcode zur Anwendung, ist nur ein Beispiel.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Unit2, AdvSmoothSlider;

type
 TForm1 = class(TForm)
  procedure FormCreate(Sender: TObject);
 private
  { Private-Deklarationen }
 public
  { Public-Deklarationen }
end;

var
Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
 Slider: TMeineSlider;

begin
 Slider := TMeineSlider.Create(self);
end;
end.
Delphi-Quellcode:
unit Unit2;

interface

uses
 AdvSmoothSlider, System.Classes, Controls, System.SysUtils;

type
 TMeineSlider = class(TComponent)
  Slider1: TAdvSmoothSlider;
  Slider2: TAdvSmoothSlider;
  procedure StateChanged(Sender: TObject;
           State: TAdvSmoothSliderState; Value: Double);
 public
  constructor Create(AOwner: TComponent);
end;

implementation

constructor TMeineSlider.Create(AOwner: TComponent);
begin
 Slider1 := TAdvSmoothSlider.Create(AOwner);
 Slider1.Parent := AOwner as TWinControl;
 Slider1.Top := 50;
 Slider1.Left := 50;
 Slider1.OnStateChanged := StateChanged;
 
 Slider2 := TAdvSmoothSlider.Create(AOwner);
 Slider2.Parent := AOwner as TWinControl;
 Slider2.Top := 100;
 Slider2.Left := 100;
 Slider2.OnStateChanged := StateChanged;
end;

procedure TMeineSlider.StateChanged(Sender: TObject;
          State: TAdvSmoothSliderState; Value: Double);
begin
 beep;
end;
end.
Das funktioniert soweit auch ganz gut, habe jedoch einige Probleme.

In der procedure TMeineSlider ist der Sender immer (), wie kann ich erreichen das der
Sender einern richtigen Wert bekommt?

Und weiter, OnStateChanged ist ja immer StateChanged zugewiesen,
wie kann ich es anstellen, dass ich die Zuweisung nicht für jeden Slider zuweisen muß?
Habe mir schon gedacht eine neue abgeleitet Klasse von TAdvSmoothSlider zu erstellen, etwa so:

Delphi-Quellcode:
type
 TMeinSlider = class(AdvSmoothSlider)
  private
   procedure StateChanged(Sender: TObject;
           State: TAdvSmoothSliderState; Value: Double);
 end;
Delphi-Quellcode:
 Slider1: TMeinSlider;
 Slider2: TMeinslider;
 usw.
Nur wird StateChanged dann nicht ausgeführt.

Weiß jemand wie es richtig geht?

Für Antworten wäre ich sehr dankbar.

MfG
Lars

Sherlock 5. Feb 2014 15:36

AW: Formular zur Laufzeit gestalten
 
Ich nehme an mit "zur Laufzeit gestalten" meinst Du die Komponenten zur Laufzeit erzeugen und setzen zu wollen. Dazu brauchst Du keine zweite Form.
Du benötigst lediglich in der Methode, die die Komponenten hinzufügen soll entsprechend ein Mal pro Komponententyp eine Variablendeklaration und dann tobst Du dich aus.
Also ungefähr:
Delphi-Quellcode:
procedure TForm1.ErzeugeKomponenten;
var einSlider: TAdvSmoothSlider;
    i: Integer;
begin
  for i := 1 to 5 do
  begin
    einSlider := TAdvSmoothSlider.Create(Self); // Damit gehört der Slider zur Instanz der TForm1 und wird beim zerstören selbiger mit freigegeben
    einSlider.Parent := Self; // Oder eben ein Panel wo das drauf liegt
    einSlider.Top := i*50 + 50; // Oder sonst irgendeine abgefahrene Mathematik zur Positionsbestimmung
    einSlider.Left := i*50 + 50; // siehe oben
    einSlider.OnStateChanged := StateChanged;
  end; // Mit jeden Durchlauf der Schleife wird ein neuer Slider erzeugt und auf die Form geklatscht...jeweils um 50 Pixel verschoben...oder so
end;
Das ist selbstverständlich noch ausbaufähig aber eine Grundlage. Du könntest Dir zum Beispiel noch eine Liste gönnen, in der Du die ganzen Slider Instanzen mitführst, um leichter auf sie zuzugreifen.

Sherlock

LarsSchwencke 5. Feb 2014 15:48

AW: Formular zur Laufzeit gestalten
 
Hallo Sherlock,

sicher, aber da die Gestaltung des Formulars recht aufwendig ist,
und ich es immer wieder verwenden möchte schien mir die Variante mit einer
wiederverwendbaren Unit als besser Lösung.

MfG
Lars

DeddyH 5. Feb 2014 15:53

AW: Formular zur Laufzeit gestalten
 
Wäre es da nicht einfacher, das Formular einmalig zu gestalten und dann in der Objektablage zu hinterlegen?

LarsSchwencke 5. Feb 2014 17:08

AW: Formular zur Laufzeit gestalten
 
Hallo,

ok, ich muß weiter ausholen.
Auf dem Forular soll es einen Bereich geben der Unterschiedlich aussieht.
An dieser Position platziere ich mittels Unit2 eine Groupbox.
Aber diese Groupbox samt Inhalt hat unterschiedliches aussehen.
Es sind unterschiedeliche Slider, Button usw. drau positioniert je nach Auswahl.

Mir schien diese Lösung ok zu sein.

Bessere Vorschläge?

MfG
Lars

Sailor 5. Feb 2014 19:08

AW: Formular zur Laufzeit gestalten
 
Wäre da eine Textdatei, die die verschiedenen Layouts beschreibt und die dann zur Laufzeit entsprechend interpretiert wird, nicht besser? Ließe sich auch ohne Compilierung etc. viel leichter erweitern etc.

Natcree 5. Feb 2014 20:50

AW: Formular zur Laufzeit gestalten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe mal was ähnliches gemacht schau dir mal das prog an vielleicht findest du was brauchbares

stahli 5. Feb 2014 22:05

AW: Formular zur Laufzeit gestalten
 
Falls es unterschiedliche aber relativ statische Controlanordnungen sein sollten könnten Frames oder embedded Forms helfen.
Man könnte dadurch verschiedene Varianten vorbereiten und dynamisch eine davon in die Groupbox setzen.

Das taugt natürlich nicht, wenn der Aufbau des Bereiches je nach Datensituation dynamisch zusammengestellt werden muss.


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