Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Prism Problem mit eigener .NET Componente (https://www.delphipraxis.net/57822-problem-mit-eigener-net-componente.html)

Master_BB 27. Nov 2005 11:43


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:
...
begin
  if (AMessage.Msg = 5) then
    MessageBox.Show('Bla');
  inherited WndProc(AMessage);
end;
ob das mit den messages helfen würde ist noch ne andere frage.

hoffendlich kann mir jemand dabei recht fix helfen,
muss das hinkriegen.

greetz

Khabarakh 27. Nov 2005 11:52

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]

Master_BB 27. Nov 2005 11:56

Re: Problem mit eigener .NET Componente
 
Die Componente
Delphi-Quellcode:
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.
ein teil der ButtonsListe
Delphi-Quellcode:

  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;
FParent ist die Control und wird beim erstellen der Buttonliste
gefillt also vor dem ersten aufruf von get ButtonsWidth

Khabarakh 27. Nov 2005 19:12

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
   }
}

Elvis 27. Nov 2005 19:29

Re: Problem mit eigener .NET Componente
 
Zitat:

Zitat von Khabarakh
Da ich mich mit Komponentenentwicklung unter .NET bis jetzt noch gar nicht beschäftigt habe, habe ich selbst mal etwas herumprobiert.

Wichtig Control != IComponent. Beides hat eigentlich rein gar nix miteinander zu tun.
Zitat:

Zitat von Khabarakh
Was soll ich sagen, es läuft :stupid: .

:mrgreen:


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