AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Prism Problem mit eigener .NET Componente
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit eigener .NET Componente

Ein Thema von Master_BB · begonnen am 27. Nov 2005 · letzter Beitrag vom 27. Nov 2005
Antwort Antwort
Master_BB

Registriert seit: 17. Mai 2003
285 Beiträge
 
Delphi 7 Professional
 
#1

Problem mit eigener .NET Componente

  Alt 27. Nov 2005, 12:43
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
Wenn das Meer unruhig ist und der Wind die Wellen treibt, erfreut es, vom Strand aus die Mühen eines Anderen zu beobachten.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: Problem mit eigener .NET Componente

  Alt 27. Nov 2005, 12:52
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 [/OT]
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Master_BB

Registriert seit: 17. Mai 2003
285 Beiträge
 
Delphi 7 Professional
 
#3

Re: Problem mit eigener .NET Componente

  Alt 27. Nov 2005, 12:56
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
Wenn das Meer unruhig ist und der Wind die Wellen treibt, erfreut es, vom Strand aus die Mühen eines Anderen zu beobachten.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#4

Re: Problem mit eigener .NET Componente

  Alt 27. Nov 2005, 20:12
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 .
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
   }
}
Miniaturansicht angehängter Grafiken
temp_189.png  
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Problem mit eigener .NET Componente

  Alt 27. Nov 2005, 20:29
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 von Khabarakh:
Was soll ich sagen, es läuft .
Robert Giesecke
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:48 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