Announcement

Collapse
No announcement yet.

Komponente mit der Bezeichnung Buttonname existiert bereits

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Komponente mit der Bezeichnung Buttonname existiert bereits

    Hallo zusammen, bin gerade dabei eine eigene Toolbar zu programmieren.
    Das klappt soweit auch schon ganz gut, aber ein großes Problem:
    Ich ziehe meine programmierte Toolbar auf das Formular, kann Eigenschaften ändern, etc.. So, nun speicher ich das Projekt ab und öffne es erneut, dann erhalte ich die Fehlermeldung "Komponente mit der Bezeichnung Button existiert bereits"
    So ich könnte mir vorstellen, dass beim ersten mal die Buttons in der dfm gespeichert werden. Beim Öffnen des Projekts versucht er zu Beginn wieder die Buttons in der dfm zu speichern, doch dort existiert dieser ja bereits,
    wie seht ihr das?

    Hier mal der code in abgespeckter Fassung, in meiner Toolbar erzeuge ich wesentlich mehr Buttons, zusätzlich habe ich noch eine Eigenschaft eingebaut, die es ermöglicht, zwischen mehreren Standards (anzahl Buttons auf Toolbar) zu wechsel. (habe ich bei diesem Code aber herausgenomme, da es nicht relevant für das Auftreten dieses Fehlers ist.
    Hoffe ihr könnt mir weiterhelfen
    Code:
    unit Unit1;
    
    interface
    
    uses
      SysUtils, Classes, Controls, Graphics, ToolWin, ComCtrls, ImgList, cxGraphics, cxStyles,
      StdCtrls, Dialogs, pngImage;
    
    type
      TToolbarType = (ttStandard1, ttStandard2, ttStandard3);
    type
      TTestToolbar = class(TToolBar)
      private
        Buttons : TToolbutton;
      protected
        procedure Notification(AComponent: TComponent; Operation: TOperation); override;
      public
        constructor create(aOwner: TComponent); override;
        destructor Destroy; override;
        { Private-Deklarationen }
      published
    end;
    
    procedure Register;
    
    implementation
    
    constructor TTestToolbar.Create;
    begin
      inherited;
      Parent := Owner as TWinControl;
    
      if Assigned(Buttons) then
        Exit;
    
      Buttons := TToolbutton.Create(self.Parent);
      Buttons.Name := 'btnTest';
      Buttons.Parent := self;
      Buttons.Caption := 'Test';
    end;
    
    procedure TTestToolbar.Notification(AComponent: TComponent;
      Operation: TOperation);
    begin
      inherited Notification(AComponent, Operation);
      if (AComponent = Buttons) and (Operation = opRemove) then
        Buttons := nil;
    end;
    
    destructor TTestToolbar.Destroy;
    begin
      Buttons.Free;
      inherited;
    end;
    
    procedure Register;
    begin
      RegisterComponents('ZTestKomponenten', [TTestToolbar]);
    end;
    
    end.

  • #2
    Eigene Komponenten sollten nicht mit T beginnen. Das ist da Prefix der VCL. Eigene Komponenten sollten entweder von TCustom.... oder direkt von der Original T.. Klasse abgeleitet werden
    Christian

    Comment


    • #3
      dann mal ne Frage dazu, wieso werden dann Komponenten von Devexpress oder Jedi auch mit T geprefixt? (z.B. Imagelist1 = TcxImageList)

      Daher bezweifle ich, das dies eine Lösung für mein Problem ist, Christian.

      Wie lässt sich dieser "beschissene" Fehle, mit dem ich mich nun schon ewig rumschlage, beheben?

      Comment


      • #4
        Deren Prefix ist Tcx
        Christian

        Comment


        • #5
          hmnn, geht mir irgendwie gerade nicht wirklich in die Birne.
          wie würdest du meinen code denn nun abändern?
          die orginal T klasse, wäre für die Toolbar, also TToolWindow.
          Verwende ich TToolWindow erhalte ich wieder Fehlermeldung, aber diesmal schon beim Kompilieren der Komponente, dass er proceduren nicht finden kann (ShowMesage, ....)

          Comment


          • #6
            Originally posted by Christian Marquardt View Post
            Eigene Komponenten sollten nicht mit T beginnen. Das ist da Prefix der VCL. Eigene Komponenten sollten entweder von TCustom.... oder direkt von der Original T.. Klasse abgeleitet werden
            Einspruch meine Ehren!


            T ist für Pascal der Präfix für eine(n) Typ(definition).


            In Komponenten erzeuge Instanen (hier Buttons := TToolbutton) sollten keinen Namen bekommen. Dies ist nur für den GUI-Designer von Delphi nötig.

            Auch solltest du Controls die als Element deiner Klasse vorhanden sind mittels .Create(self) erzeugt werden:

            Code:
            constructor TTestToolbar.Create;
            begin
              inherited;
            
              Buttons := TToolbutton.Create(self);
              Buttons.Parent := self;
              Buttons.Caption := 'Test';
            end;

            Comment


            • #7
              Eine eigene Komponente Tirgendwas bringt ärger mit einer gleichnamigen VCL Komponente. Man muss dann scharf aufpassen, wann welche gemeint ist
              Christian

              Comment


              • #8
                habe es so gemacht, wie von Herr Geyer geschrieben wurde:
                constructor TTestToolbar.Create;
                begin
                inherited;

                Buttons := TToolbutton.Create(self);
                Buttons.Parent := self;
                Buttons.Caption := 'Test';
                end;
                soo, ich kann meine komponente aufs formular ziehen, kann mein projekt abspeichern, und das projekt auch neu laden --> Ich bekomme keine Fehlermeldung.
                Nun aber folgende Probleme:
                - Nachdem ich mein Projekt neu geladen habe, erstellt er mir automatisch einen neuen Button, löscht den vorherigen allerdings nicht aus der Komponente. (kann den ersten Button, also nicht mehr anklicken)

                - Er erstellt mir jedes mal wenn ich das Projekt neu lade, einen neuen Button. Den ersten kann ich nachwie vor nicht anklicken, die nachfolgenden meckert er mit der unten geschriebenen Meldung.
                - Wenn ich die "neu hinzugefügten" Buttons anklicke sagt er mir "Für eine unbekannte Komponente kann keine Methode erstellt werden". = Komponente hat keinen Namen?

                Comment

                Working...
                X