![]() |
Problem mit eigener .NET Componente
Hallo,
ich hab seit Stunden arge Probleme mit meiner eigenen Componente. Ich hab eine vom Panel abgeleitete Classe MyPanel (jetzt fürs bsp). Diese beinhaltet eine Eigenschaft Buttons welche eine eigene TButtonsListe ist. Die Liste enthält Buttons welche so breit sein sollen wie MyPanel durch Auslesen von MyPanel.Width. Ich gebe der ButtonListe bei der selbst definierten Eigenschaft Parent die Control MyPanel mit und die ButtonItems in der Liste bekommen als Parent die Liste. Dadurch greif cihv on jedem Button auf die Control zu. Und ich kann halt die Buttongröße eigentlich über die größe des MyPanels steuern. Problem ist jedoch nur das bei den Buttons immer nur ein Wert ankommt und zwar 200. Obwohl MyPanel größer bzw kleiner ist. Irgentwie übernimmt der die im Designer veränderte größe des MyPanels nicht. Hat jemand eine idee wie man das lösen kann? Ich dachte mir vieleicht mit WindowsMessages, es wird ja immer eine verschickt beim resizen. Da gibts jedoch das problen das wenn das implementiert ist und ich die componente auf eine Form packe kommt ein Handle fehler. WndProc rountinen implementation sieht so aus:
Delphi-Quellcode:
ob das mit den messages helfen würde ist noch ne andere frage.
...
begin if (AMessage.Msg = 5) then MessageBox.Show('Bla'); inherited WndProc(AMessage); end; hoffendlich kann mir jemand dabei recht fix helfen, muss das hinkriegen. greetz |
Re: Problem mit eigener .NET Componente
Wie sieht dein bisheriger Code aus? Überschreibst du Control.OnResize?
Windows-Messages sollte man unter .NET nur als letze Möglichkeit in Betracht ziehen, hier gibt es sicher eine andere Lösung. [OT]T-Prefixe haben in .NET nichts zu suchen :wink: [/OT] |
Re: Problem mit eigener .NET Componente
Die Componente
Delphi-Quellcode:
ein teil der ButtonsListe
unit ButtonBarU;
interface uses BarButtonsU, System.ComponentModel, System.Windows.Forms; const WM_Size = 5; type TBarButtonClickEvent = procedure(sender : TButtonItem) of Object; TButtonBar = class(Panel) strict protected procedure WndProc(var AMessage : System.Windows.Forms.Message); override; protected FButtons : TButtonList; FOnBarButtonClick : TBarButtonClickEvent; protected procedure InitializeObject; public constructor Create; property Buttons : TButtonList read FButtons; published [Category('Buttons'), Description('Raised while a button was clicked')] property OnBarButtonClick : TBarButtonClickEvent read FOnBarButtonClick write FOnBarButtonClick; end; implementation uses System.Security.Permissions; {$REGION TButtonBar} { TButtonBar } constructor TButtonBar.Create; begin inherited; InitializeObject; FButtons := TButtonList.Create(Self); end; procedure TButtonBar.InitializeObject; begin FButtons := nil; FOnBarButtonClick := nil; end; {$ENDREGION} //[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name='FullTrust')] procedure TButtonBar.WndProc(var AMessage : System.Windows.Forms.Message); begin if AMessage.Msg = WM_SIZE then MessageBox.Show(Width.ToString); Inherited WndProc(AMessage); end; end.
Delphi-Quellcode:
FParent ist die Control und wird beim erstellen der Buttonliste TButtonList = class(ArrayList) protected function get_ButtonsWidth : Int32; function TButtonList.get_ButtonsWidth: Int32; begin if (FParent <> nil) then Result := FParent.Width - (2 * FButtonConst.ButtonSpaceLeftRight) else Result := 0; end; gefillt also vor dem ersten aufruf von get ButtonsWidth |
Re: Problem mit eigener .NET Componente
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe eigentlich den Code vor den Messages gemeint. Da ich mich mit Komponentenentwicklung unter .NET bis jetzt noch gar nicht beschäftigt habe, habe ich selbst mal etwas herumprobiert. Was soll ich sagen, es läuft :stupid: .
Code:
namespace ButtonPanel
{ /// <summary> /// Eine vertikale Liste von Buttons, die das ClientRect des Panels voll /// ausfüllen /// </summary> public class ButtonPanel : System.Windows.Forms.Panel { List<Button> buttonList = new List<Button>(); int buttonCount = 0; const int ButtonHeight = 20; [Browsable(false)] public List<Button> ButtonList { get { return buttonList; } } [DefaultValue(0)] public int ButtonCount { get { return buttonCount; } set { buttonCount = value; int count = ButtonList.Count; if (value < count) { ButtonList.RemoveRange(value, count - value); } else { for (int i = count; i < value; i++) { Button button = new Button(); button.Parent = this; button.Top = i * ButtonHeight; button.Width = this.ClientSize.Width; button.Height = ButtonHeight; ButtonList.Add(button); } } } } public ButtonPanel() { // // The InitializeComponent() call is required for Windows Forms designer support. // InitializeComponent(); // // TODO: Add constructor code after the InitializeComponent() call. // } protected override void OnResize(EventArgs e) { foreach (Button button in ButtonList) { button.Width = this.ClientSize.Width; } base.OnResize(e); } #region Windows Forms Designer generated code /// <summary> /// This method is required for Windows Forms designer support. /// Do not change the method contents inside the source code editor. The Forms designer might /// not be able to load this method if it was changed manually. /// </summary> private void InitializeComponent() { // // UserControl1 // this.Name = "UserControl1"; this.Size = new System.Drawing.Size(292, 266); } #endregion } } |
Re: Problem mit eigener .NET Componente
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:52 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