Announcement

Collapse
No announcement yet.

Property finden

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

  • Property finden

    Hallo zusammen,

    ich bräuchte folgende Funtionalität. Vielleicht kann mir jemand von euch helfen.

    Ich habe Informationen über ein Objekt in Textform vorhanden. D.h. ich weiss z.B. dass das Objekt X heisst und dass es eine Eigenschaft Enabled hat. Ich bekomme das in der folgenden Form

    Objekt:= 'X';
    PropertyToSet:='Enabled'
    ValueToSet:='True'

    D.h. ich bekomme es immer als String. Der Objekttyp des Objekts ist mir unbekannt. Ich weiss aber dass das Property vorhanden ist. Wie könnte ich da Code schreiben, welcher auf das Objekt zugreift, und das angegebene Property setzen kann, ohne dass ich weiss dass das Objekt dieses besitzt.

    Ich könnte zwar folgendes machen:

    if lowercase(PropertyToSet) ='enabled' then
    X.Enabled:=StrToBoolean(ValueToSet), nur wurd das zu kompliziert, da ich dann auf jedes Property welches ich setzteen möchte getrennt eingeben muss. Gibt es da kein RecordSet, ähnlich bei Dataset über welches einfach auf die Property in "Textform" zugegriffen werden kann ?

    In Hoffnung auf eine baldige Antwort von jemandem

    mfg

    Astner Klaus

  • #2
    Das Zauberwort heißt RTTI (Runtime-Type-Information) und dieses Problem hat ja auch die Delphi-IDe mit dem Objektinspektor gelößt.

    Wühl dich z.B. mal durch die Units TypInfo.pas

    Comment


    • #3
      Vielen Dank

      Astner Klau

      Comment


      • #4
        Gibt es dazu vielleicht irgendwelche Samples

        Comment


        • #5
          Hllo Klaus,<BR><BR>
          wenn es sich bei dem Object um TComponent handelt, würde ich die Zeile in das Format von Delphi umwandeln.<BR>
          Aus deinem Beispiel würde dann:<PRE>
          Objekt X: ClassName
          Enabled = True
          end
          </PRE>
          Dann kannst du mit:<PRE>
          function StringToComponent(Value: string; Component : TComponent = nil):
          TComponent;
          var
          StrStream : TStringStream;
          BinStream : TMemoryStream;
          begin
          StrStream := TStringStream.Create(Value);
          try
          BinStream := TMemoryStream.Create;
          try
          ObjectTextToBinary(StrStream, BinStream);
          BinStream.Seek(0, soFromBeginning);
          Result := BinStream.ReadComponent(Component);
          finally
          BinStream.Free;
          end;
          finally
          StrStream.Free;
          end;
          end;
          </PRE>
          Mußt natürlich vorher mit FindComponent die Compo suchen, um ClassName und halt die Compo zu erhalten.<BR><BR>
          Fran

          Comment


          • #6
            oder so:<PRE>
            procedure TForm1.StringToProp(AComponentName: String; APropName: String;
            AValue : String);
            Var
            AComponent : TComponent;
            APropInfo : PPropInfo;
            begin
            AComponent := FindComponent(AComponentName);
            if Assigned(AComponent) and IsPublishedProp(AComponent, APropName) then
            begin
            APropInfo := GetPropInfo(AComponent, APropName);
            case APropInfo.PropType^.Kind of
            tkInteger:
            SetOrdProp(AComponent, APropName, StrToInt(AValue));
            tkChar, tkWChar:
            SetOrdProp(AComponent, APropName, StrToInt(AValue[1]));
            tkEnumeration :
            SetEnumProp(AComponent, APropName, AValue);
            tkFloat:
            SetFloatProp(AComponent, APropName, StrToFloat(AValue));
            tkString:
            SetStrProp(AComponent, APropName, AValue);
            tk...
            end;
            end;
            end;
            </PRE>
            Fran

            Comment


            • #7
              Danke allen zusammen, ich konnte damit das Problem löse

              Comment

              Working...
              X