Announcement

Collapse
No announcement yet.

Property TStrings in von TComboBox abgeleiteter Komponente

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

  • Property TStrings in von TComboBox abgeleiteter Komponente

    Ich habe mir eine eigene Komponente erstellt, die ich von TComboBox
    abgeleitet habe. Die neue Komponente sollte eine zusätzliche Property
    vom Format TStrings haben. Wenn ich nun aber im Objektinspektor meine neue
    Eigenschaft anklicke kommt <b> statt dem erwarteten Stringslisteneditor </b> nur die Meldung:

    <b> nil kann dem TMemoString nicht hinzugefügt werden </b>.

    Was habe ich falsch gemacht?

  • #2
    Du mußt in dem Konstruktor create erst einmal eine Instanz Deiner TStrings erzeugen.<br>
    Wenn Du also z.B. eine Variable fMyItems=TStrings in Deiner Komponente einfügst<br>
    und eine property MyItems:TStrings read fMyItems write SetMyItems<br>
    einfügst, Muß im create() eine Anweisung<br>
    fMyItems:=TStrings.Create stehen<br>
    Im Destruktor sollte dann natürlich auch ein fMyItems.Free folgen!<br&gt

    Comment


    • #3
      Vielen Dank für diesen Tip. Das habe ich natürlich gemacht. Ich denke ich drucke meinen Sourcecode hier einfach mal ab.

      unit Abscombo;

      interface

      uses
      SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
      Forms, Dialogs, sysreg,stdreg,StdCtrls,Menus;

      type

      TabsCombo = class(TCustomComboBox)
      private
      { Private-Deklarationen }
      FValues:Tstrings;
      procedure SetValues(Value: TStrings);
      { Protected-Deklarationen }
      public
      constructor create(AOwner:Tcomponent);
      { Public-Deklarationen }
      property Values:Tstrings read FValues write Setvalues;

      { Published-Deklarationen }
      end;
      { Published-Deklarationen }

      procedure Register;

      implementation
      uses consts;

      procedure Register;
      begin
      RegisterComponents('Zusätzlich', [TabsCombo]);
      end;

      constructor TABSCombo.create(AOwner:Tcomponent);
      begin
      inherited create(Aowner);
      Fvalues:=TStrings.Create;
      end;

      procedure TabsCombo.Setvalues(Value: TStrings);
      begin
      values.Append(Value);
      end;

      end.

      <b> Wo liegt der Fehler? </b&gt

      Comment


      • #4
        Probier doch einfach mal ein fValues:=TStringList.create...<br>
        Hab nicht aufgepasst... TStrings funktioniert nicht! Schau dir mal den Quellcode von TComboBox an.<br>
        Da wird auch nicht TStrings.Create sondern TComboBoxStrings.Create.<br>
        TStrings.Create ist eine abstrakte methode. Macht also eigentlich gar nix.<br>
        TStrngList.create ist da schon etwas "realer".<br>
        Desweiteren solltest Du bei Setvalues ein values.assign(value) machen<br&gt

        Comment


        • #5
          Ich habe das auch schon analog zu der TComboBox gemacht. Der Erfolg
          war leider der gleiche.

          Ich verstehe es nicht

          Comment


          • #6
            Hey, moment mal!<br>
            <br>
            <b>Folgender Source klappt bei mir prima:</b><br>
            <br>
            <br>
            unit abscombo;<br>
            interface<br>
            <br>
            uses classes, stdctrls;<br>
            <br>
            type<br>
            <br>
            TabsCombo = class(TCustomComboBox)<br>
            private<br>
            { Private-Deklarationen }<br>
            FValues:Tstrings;<br>
            procedure SetValues(Value: Tstrings);<br>
            { Protected-Deklarationen }<br>
            public<br>
            constructor create(AOwner:Tcomponent);override;<br>
            { Public-Deklarationen }<br>
            published<br>
            property Values:Tstrings read FValues write Setvalues;<br>
            <br>
            { Published-Deklarationen }<br>
            end; { Published-Deklarationen }<br>
            <br>
            procedure Register;<br>
            <br>
            implementation uses consts;<br>
            <br>
            procedure Register;<br>
            begin <br>
            RegisterComponents('Rossi', [TabsCombo]);<br>
            end;<br>
            <br>
            constructor TABSCombo.create(AOwner:Tcomponent);<br>
            begin<br>
            inherited create(Aowner);<br>
            Fvalues:=TStringList.Create;<br>
            end;<br>
            <br>
            procedure TabsCombo.Setvalues(Value: Tstrings);<br>
            begin<br>
            values.Assign(Value);<br>
            end;<br>
            <br>
            end.<br&gt

            Comment


            • #7
              Wirklich gut. Jetzt funktioniert es. Und ich glaube es lag nur
              an dem Wörtchen <b> override </b>, daß ich nach der Deklaration des Constructors vergessen hatte.

              Vielen Dank Rossi

              Comment


              • #8
                Hallo Bernd<br>
                <br>
                Wenn Du die Combobox ableiten willst, dann solltest Du auch auf Ihre Stringliste (des Windowsobjekts) zugreifen. Das erstellen einer eigenen (redundanten) Liste erachte ich nicht als sinnvoll (zudem weiss das Control auch nichts davon...) Evt. musst du nur die in TCustomCombobox deklarierte Liste veröffentlichen.
                <br>
                <br>
                Gruss, Ren&#233

                Comment

                Working...
                X