Announcement

Collapse
No announcement yet.

Published-Eigenschaft steht nicht in der Eigenschaften-Liste!!

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

  • Published-Eigenschaft steht nicht in der Eigenschaften-Liste!!

    Hallo erstmal.

    Das Problem das ich hier beschreibe steht auch schon im Abschnitt Anfänger aber es gehört eigentlich auch hierher.

    Ich hab da eine Komponente gemacht die eine selbstdefinierte Eigenschaft enthalten soll. Naja, eigentlich enthält die Komponente einige selbstdefinierte properties aber nur eine Eigenschaft die unter published definiert wurde ist später nicht in der Eigenschaften-Liste sondern kann nur über den Quelltext aufgerufen und verändert werden. Woran kann das liegen. Die Eigenschaft wurde etwa wie folgt festgelegt:
    .<br>
    .<br>
    TDirection = (horizontal, vertical); //Hilfstyp für Eigenschaft!!!<br>
    .<br>
    .<br>
    <br>
    type //Typ der Eigenschaft<br>
    Teigener_Typ = record<br>
    Values: array[1..4] of byte;<br>
    Text: string;<br>
    Direction: TDirection;<br>
    end;<br>
    <br>
    TeigeneKompo = class(TGraphicControl)<br>
    private<br>
    Typ1: Teigener_Typ;<br>
    procedure SetTyp(Typ1: Teigener_Typ);<br>
    .<br>
    .<br>
    published<br>
    property Eigene_Eigenschaft: Teigener_Typ read Typ1 write settyp; <br>
    .<br>
    .<br>
    <br>
    Hat jemand eine Erklärung für das oder liegt der Fehler vielleicht an dem eingebundenen Array ? Ich hab leider keine Ahnung wo der Fehler steckt, was vielleicht auch daran liegt, dass ich erst kurz mit der Komponentenentwicklung arbeite. Trotzdem wäre ich für jeden Rat dankbar.
    Außerdem wollte ich mal fragen ob irgend jemand weiß, wie ich festlegen kann dass die Größe meiner Komponente durch Ziehen mit der Maus nur in bestimmten Stufen verändert werden kann. Das wäre glaub ich sehr hilfreich für mein Vorhaben. Danke schonmal im Vorraus.
    <br>
    Bis denn dann, Detlef.

  • #2
    Hallo,
    ich bin zwar kein Komponentenentwickler, aber wieso wird bei der Methode SetType der Parameter Typ1 übergeben? Müsste es nicht so aussehen:
    <code><pre>
    procedure SetTyp(Value: Teigener_Typ);
    begin
    ...
    Typ1:= Value;
    ...
    end;</pre></code>
    PS: Sie sollten die andere Diskussion löschen

    Comment


    • #3
      Danke erstmal für die Antwort.

      Muß die Variable zur Übergabe wirklich Value heißen oder ist das nicht eigentlich egal ? Naja, ich werds mir auf jeden Fall mal merken, ich bin ja auch kein Komponentenentwickler(noch ziemlich unerfahren mit Delphi).<br>Aber eigentlich liegt das mit dem Anzeigen des Published-Property glaub ich an dem Array. Ich hab nämlich auch mal ein Array einzeln als Eigenschaft deklariert und dann kam eine Meldung, dass Delphi keine Arrays in der Eigenschaftenliste anzeigen kann(oder so ähnlich). Aber bei Memo(Lines[x]) ging das ja auch, oder ? Deshalb frag ich mich eben wie man diese Barriere umgehen kann.

      Bis dann, Detlef

      Comment


      • #4
        Hi

        published Eigenschaften können nur im OI angezeigt werden wenn ein Eigenschafts-Editor für den Typ der Eigenschaft registriert wurde. Mit RegisterPropertyEditor(TCustomPropertyEditorClass) kann ein eigener Eigenschaftseditor registriert werden. Nun, für alle Standard-Typen wie Integer/Chars/Strings/TClass/TFont/TColor usw. existieren schon solche. Du hast nun zwei Möglichkeiten:
        <li>ändere den Typ der Eigenschaft in einen Standardtyp um
        <li>schreib Deinen eigenen PropertyEditor

        Zum ersteren könntest Du das Array[4] in ein TObject mit 4 Eigensschaften umschreiben oder einfach 4 Properties in Deiner Komponente nutzen (anstatt array), z.B. so:

        <pre>

        type
        TMyCompo = class()
        private
        FArray: array[0..3] of Integer;
        function GetArray(Index: Integer): Integer;
        procedure SetArray(Index, Value: Integer);
        published
        property Array_1: Integer index 0 read GetArray write SetArray;
        property Array_2: Integer index 1 read GetArray write SetArray;
        ... usw.
        end;<br>

        function TMyCompo.GetArray(Index: Integer): Integer;
        begin
        Result := FArray[Index];
        end;<br>

        procedure TMyCompo.SetArray(Index, Value: Integer);
        begin
        if FArray[Index] <> Value then
        begin
        FArray[Index] := Value;
        if Assigned(FOnChange) then FOnChange(Self); // Vorteil von Set-Methoden
        end;
        end;<br>

        </pre>

        Für die zweite Variante musst Du Dich in das DesignTime Interface von delphi einarbeiten. Sei gewarnt, da sich dieses ständig in allen Delphi Versionen geändert hat und wird.

        Gruß Hage

        Comment


        • #5
          Hallo Hagen, <br>
          <br>
          danke für die Nachhilfe.<br>
          Dass man in der Zeile zur Definition der Eigenschaft gleichzeitig einen zweiten, konstanten Wert übergeben kann wußte ich nicht(wie so Vieles). Die Lösung scheint auch einen ganz guten Ersatz für ein Array zu bieten, auch wenn sie ein wenig umfangreicher ist. Ist wohl trotzdem noch besser als einen eigenen Eigenschaftseditor zu schreiben. Also, vielen Dank nochmal.<br>
          <br>
          Bis denn dann, Detlef.<br&gt

          Comment


          • #6
            Hi

            Komponenten- bzw. Object Design ist immer eine aufwendigere Arbeit. <b>ALLE</b> Komponenten die ich sah die NICHT aufwendig waren, sind entweder misserabel oder kapseln solche funktionen wie StrToInt(), also völlig überflüssig. Der notwendige Mehraufwand an Tippserei macht Dein Leben in Zukunft einfacher, wenn es heist: Update/Bugs/neue Features ins Object zu bringen. Gilt meiner Meinung nach auch für COM Interfaces. Das ist auch logisch da eine Komponente bzw. Object nur dann Sinn macht wenn es mehrfach verwendet wird. Ein EINMAL-Object kann auch per Prozeduren implementiert werden.

            Gruß Hage

            Comment


            • #7
              Hi Hagen,

              klingt irgendwie als hätt ich was Falsches gesagt. Wenn ja, war nicht so gemeint. Ich will ja auch Nichts, was nur proffesorisch zusammengeflickt ist, zumindest wenn es um richtige Projekte geht. Deine Lösung ist gut und ich bin auch dankbar dafür.

              Bis dann, Detlef

              Comment


              • #8
                Nee, war nur nochmal zur Bestätigung das Dein Weg richtiger ist.
                Der anfängliche Mehraufwand lohnt sich immer.

                Gruß Hage

                Comment


                • #9
                  Danke für alles<br>
                  <br>
                  und bis die Tage.<br>
                  <br>
                  Gruß Detlef<br&gt

                  Comment

                  Working...
                  X