Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Wie kann ich Reihenfolge von Komponenten im DFM ändern? (https://www.delphipraxis.net/25966-wie-kann-ich-reihenfolge-von-komponenten-im-dfm-aendern.html)

aMuTeX 15. Jul 2004 16:52


Wie kann ich Reihenfolge von Komponenten im DFM ändern?
 
Hallo

Ich schreibe gerade eine art PageControl Komponente, aber nicht von TPageControl abgeleitet. Soweit sogut. Mein Problem: Die Reihenfolge der Pages (analog PageIndex beim TPageControl) wird nicht im DFM gespeichert. Wenn ich beim TPageControl den PageIndex einer Page ändere wird im DFM die Reihenfolge der object Einträge der TabSheets geändert:
Delphi-Quellcode:
  object PageControl1: TPageControl
    Left = 504
    Top = 384
    Width = 289
    Height = 193
    ActivePage = TabSheet3
    TabOrder = 0
    object TabSheet1: TTabSheet
      Caption = 'TabSheet1'
    end
    object TabSheet3: TTabSheet
      Caption = 'TabSheet3'
      ImageIndex = 2
    end
    object TabSheet2: TTabSheet
      Caption = 'TabSheet2'
      ImageIndex = 1
    end
  end
Beim instanzieren der Tabsheets wird dann auch eben diese Reihenfolge eingehalten.

Wie kann ich das bei meiner Komponente realisieren? Wie kann ich die Reihenfolge meine Pages im DFM ändern?


Besten Dank im Voraus.

oki 16. Jul 2004 10:38

Re: Wie kann ich Reihenfolge von Komponenten im DFM ändern?
 
Hi,

ich mir jetzt nicht ganz sicher wie du es bei dir umsetzen mußt, aber rein prinzipiell habe ich festgestellt, dass bei Kompos die zur Designzeit implementiert werden alle published-Eigenschaften bei Abweichung vom default-Wert in der DFM des Owners mit abgelegt werden.

Bsp:

Delphi-Quellcode:
published
  MyWert : Integer read FMyWert write FMyWert default 0;
end;
Wenn jetzt zur Designzeit MyWert über den Objectinspektor auf 1 (abweichend von 0) gesetzt wird, dann wird dieser Wert im DFM des Besitzerfensters im Bereich des BesitzerObjektes von MyWert abgelegt und beim nächsten Aufruf des Projektes gesetzt.

Ich hoffe, dass hat etwas weiter geholfen,

Gruß oki

aMuTeX 16. Jul 2004 12:18

Re: Wie kann ich Reihenfolge von Komponenten im DFM ändern?
 
Hi oki

Danke erstmal, aber das ist mit schon klar. Nur bei mir ist das nicht so einfach. Das Page object kennt seinen eigenen PageIndex nicht. Ich kann also nicht einfach einen Wert im DFM speichern. Vielmehr ist die Reihenfolge beim instanzieren ausschlaggebend für die Position (PageIndex) innerhalb meines PageControls (so wird es jedenfalls auch beim TPagecontrol gemacht). Nur ich habe keinen Einfluss auf diese instazierungs Reihenfolge, ausser eben die im DFM. Aber wie ändere ich diese?

Grob sieht mein Code etwas so aus:
Delphi-Quellcode:
  TMyPage = class(TCustomControl)
  private
    FPageControl: TMyPageControl;
    procedure SetPageControl(const Value: TMyPageControl);
    function GetPageIndex: Integer;
    procedure SetPageIndex(const Value: Integer);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property TabIndex: Integer read GetTabIndex;
  published
    property PageIndex: Integer read GetPageIndex write SetPageIndex stored False;
    property PageControl: TMyPageControl read FPageControl write SetPageControl;
  end;

  TMyPageControl = class(TCustomControl)
  private
    FPages: TList;
    FActivePage: TMyPage;
    procedure ChangeActivePage(Page: TMyPage);
    procedure SetActivePage(Page: TMyPage);
    procedure SetActivePageIndex(PageIndex: Integer);
    function GetActivePageIndex: integer;
    function GetPageCount: Integer;
    function GetPage(Index: Integer): TMyPage;
    procedure InsertPage(Page: TMyPage );
    procedure RemovePage(Page: TMyPage );
    function GetTabIndex: Integer;
    procedure SetTabIndex(const Value: Integer);
    procedure MoveTab(CurIndex, NewIndex: Integer);
  protected
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure ActivateNextPage;
    procedure ActivatePrevPage;
    function FindNextPage(CurPage: TMyPage): TMyPage;
    property ActivePageIndex: Integer read GetActivePageIndex write SetActivePageIndex;
    property PageCount: Integer read GetPageCount;
    property Pages[Index: Integer]: TMyPage read GetPage;
  published
    property ActivePage: TMyPage read FActivePage write SetActivePage;  
    property TabIndex: Integer read GetTabIndex write SetTabIndex default -1;
    property OnChange: TNotifyEvent read FOnChange write FOnChange;
    property OnChanging: TTabChangingEvent read FOnChanging write FOnChanging;
  end;
Delphi-Quellcode:
function TMyPage.GetPageIndex: Integer;
begin
  if FPageControl <> nil then
  begin
    if FPageControl.FPages <> nil then
      Result := FPageControl.FPages.IndexOf(Self)
    else
      Result := -1;
  end else
    Result := -1;
end;

procedure TMyPage.SetPageIndex(const Value: Integer);
var
  I: Integer;
begin
  if FPageControl <> nil then
  begin
    I := TabIndex;
    FPageControl.FPages.Move(PageIndex, Value);
    if I >= 0 then FPageControl.MoveTab(I, TabIndex);
  end;
end;
Das ist von TPageControl kopiert. Es hilft auch nicht wenn ich das property PageIndex auf stored True setze. Dann wird zwar ein Wert im DFM gespeichert, aber beim laden wird er ignoriert. Wieso?

oki 16. Jul 2004 13:36

Re: Wie kann ich Reihenfolge von Komponenten im DFM ändern?
 
Hi,

jetzt hab ich mitbekommen wo dein Problem steckt. Ähnliches hatte ich auch schon mal. Bei mir war es so, dass ich meine eigenen TabSheets zur Laufzeit aus einer eigenen Klasse creiert habe. nun ist es ja so, dass entsprechend der erstellungsreihenfolge der PageIndex automatisch gesetzt wird. Erstelle ich also erst das 2., so kann ich dort nicht schon den PageIndex 5 vergeben (beispielsweise). Hier geht nur eins, von vornherein alle in der richtigen reihenfolge erstellen, oder nach dem create alles seperat zuweisen. Direktes eigenes Schreiben in die DFM bringt somit nichts (ist aber auch möglich glaube ich).

Gruß oki

aMuTeX 16. Jul 2004 14:33

Re: Wie kann ich Reihenfolge von Komponenten im DFM ändern?
 
Merci. Ich denke da bleibt mir wohl nix anderes übrig als die PageIndizes nach dem Kreieren nochmal zuzuweisen :-(

Die Reihenfolge im DFM bestimmt ja die Instanzierungs-Reihenfolge. Wäre schön wenn man das DFM beeinflussen könnte.


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