![]() |
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:
Beim instanzieren der Tabsheets wird dann auch eben diese Reihenfolge eingehalten.
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 Wie kann ich das bei meiner Komponente realisieren? Wie kann ich die Reihenfolge meine Pages im DFM ändern? Besten Dank im Voraus. |
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:
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.
published
MyWert : Integer read FMyWert write FMyWert default 0; end; Ich hoffe, dass hat etwas weiter geholfen, Gruß oki |
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:
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?
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; |
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 |
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 22:59 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