![]() |
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:
Das funktioniert soweit auch ganz gut, habe jedoch einige Probleme.
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. 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:
Nur wird StateChanged dann nicht ausgeführt.
Slider1: TMeinSlider;
Slider2: TMeinslider; usw. Weiß jemand wie es richtig geht? Für Antworten wäre ich sehr dankbar. MfG Lars |
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:
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.
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; Sherlock |
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 |
AW: Formular zur Laufzeit gestalten
Wäre es da nicht einfacher, das Formular einmalig zu gestalten und dann in der Objektablage zu hinterlegen?
|
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 |
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.
|
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
|
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 11:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz