AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Eigenschaften unterschiedlicher Objekte ändern
Thema durchsuchen
Ansicht
Themen-Optionen

Eigenschaften unterschiedlicher Objekte ändern

Ein Thema von WIng2005 · begonnen am 7. Okt 2008 · letzter Beitrag vom 1. Apr 2009
Antwort Antwort
Seite 2 von 3     12 3      
nahpets
(Gast)

n/a Beiträge
 
#11

Re: Eigenschaften unterschiedlicher Objekte ändern

  Alt 7. Okt 2008, 09:17
Hallo,
Zitat von messie:
Zitat von WIng2005:
Ich ging davon aus, dass die Komponenten von TObject abstammen und somit
Sie stammen von TComponent ab.

Grüße, Messie
Beide Ausssagen sind richtig, aber: mit den angeführten Methoden können nur die Eigenschaften geändert werden, über die TObject bzw. TComponent verfügen. ReadOnly gehört nicht dazu.
Du hast nur zwei Möglichkeiten:
Entweder Du suchst Dir aus der Hilfe den gemeinsamen Vorfahren, der über die gewünschte Eigenschaft verfügt und hangelst Dich ggfls. durch entsprechende If-Kaskaden oder Du benutzt die von Bernhard Geyer beschriebene Methode. Bernhards Methode hat den Charme, dass Du sie genau einmal implementieren musst und dann sämtliche Komponenten damit "funktionieren" und bei Änderungen am Programm musst Du an die entsprechende Stelle mit den Eigenschaftszuweisungen nicht mehr ran.
  Mit Zitat antworten Zitat
DerDan

Registriert seit: 15. Nov 2004
Ort: Donaueschingen
251 Beiträge
 
Delphi XE3 Professional
 
#12

Re: Eigenschaften unterschiedlicher Objekte ändern

  Alt 7. Okt 2008, 09:20
Hallo,


das vom Bernd ist doch gut:

Auf den ersten blick vielleicht aufwendiger, aber dafür eine Universal-Lösung.

Mfg

Zitat von Bernhard Geyer:
RTTI ist das Zauberwort. Genau so wie auch die VCL/RTL aus den DFM-Ressourcen die Komponenten wieder herstellt.

Hier ein Beispiel zum setzen eines Boolean-Properties:

Delphi-Quellcode:
uses
  TypInfo;

procedure MySetPropertyBool(Component: TComponent; const PropName: String; const Value: Boolean);
var
  PropInfo: PPropInfo;
begin
  if (Component <> nil) then
  begin
    PropInfo := GetPropInfo(Component.ClassInfo, PropName);
    if (PropInfo <> nil) then
    begin
      if (PropInfo^.PropType^.Kind in [tkEnumeration]) then
        SetEnumProp(Component, PropInfo, BooleanIdents[Value]);
    end;
  end;
end;
nichts ist so schön wie man es sich vorstellt
  Mit Zitat antworten Zitat
WIng2005

Registriert seit: 20. Mär 2006
Ort: Thüringen
388 Beiträge
 
Delphi XE Starter
 
#13

Re: Eigenschaften unterschiedlicher Objekte ändern

  Alt 7. Okt 2008, 09:21
Habe es jetzt so:

Delphi-Quellcode:
for i := 0 to Mainform.ComponentCount - 1 do
Begin
if (Mainform.Components [i]).tag=1 then
Begin
  if (Mainform.Components[i] is TEdit) then
  Begin
    TEdit(Mainform.Components[i]).Color :=cl3DLight;
    TEdit(Mainform.Components[i]).readonly :=true;
  end
else if (Mainform.Components[i] is TMemo) then
  Begin
    TMemo(Mainform.Components[i]).Color :=cl3DLight;
    TMemo(Mainform.Components[i]).readonly :=true;
  end
else if (Mainform.Components[i] is TListbox) then
    TMemo(Mainform.Components[i]).Color :=cl3DLight;
end //if

else

Begin
  if (Mainform.Components[i] is TEdit) then
  Begin
    TEdit(Mainform.Components[i]).Color :=clwindow;
    TEdit(Mainform.Components[i]).readonly :=false;
  end
else if (Mainform.Components[i] is TMemo) then
  Begin
    TMemo(Mainform.Components[i]).Color :=clwindow;
    TMemo(Mainform.Components[i]).readonly :=false;
  end
else if (Mainform.Components[i] is TListbox) then
    TMemo(Mainform.Components[i]).Color :=clwindow;
end //if



end;//for
gelöst. Scheint mir nur irgendwie sehr "aufgebauscht". Die Methode von Bernhard werde ich mir heute nach der Arbeit mal anschauen... habe das Gefühl, dass das länger dauern wird

MFG
Steffen
  Mit Zitat antworten Zitat
WIng2005

Registriert seit: 20. Mär 2006
Ort: Thüringen
388 Beiträge
 
Delphi XE Starter
 
#14

Re: Eigenschaften unterschiedlicher Objekte ändern

  Alt 7. Okt 2008, 11:36
@Bernhard: Habe mir mal die typinfo angeschaut. Für mich scheint es , als könne man die Color-Property mit:

Delphi-Quellcode:
procedure MySetPropertyColor(Component: TComponent; const PropName: String; const Value: string);
var
  PropInfo: PPropInfo;
begin
  if (Component <> nil) then
  begin
    PropInfo := GetPropInfo(Component.ClassInfo, PropName);
    if (PropInfo <> nil) then
    begin
      if (PropInfo^.PropType^.Kind in [tkEnumeration]) then
        SetSetProp(Component, PropInfo, Value); //Wäre das überhaupt die richtige Methode?
    end;
  end;
end;

//aufgerufen mit:

MySetPropertyColor(edit1,'color','clred');
ändern. Leider bleibt der Aufruf bei mir funktionslos. Vielleicht hast du ja nen Tip, wo der Fehler liegt.

MFG
Steffen
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#15

Re: Eigenschaften unterschiedlicher Objekte ändern

  Alt 7. Okt 2008, 11:42
Hier liegt doch keine Menge vor. Du musst auf tkInteger prüfen und dann mit SetOrdProp den Wert setzen.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#16

Re: Eigenschaften unterschiedlicher Objekte ändern

  Alt 7. Okt 2008, 11:53
So solle es gehen:
Delphi-Quellcode:
uses
  TypInfo;


procedure MySetPropertyColor(Instance: TComponent; const PropName: String; const Value: TColor);
resourcestring
  SUnknownProperty = 'Eigenschaft %s existiert nicht.';
var
  PropInfo: PPropInfo;
begin
  PropInfo := GetPropInfo(Instance, PropName);
  if PropInfo = NIL then
  begin
    raise EPropertyError.CreateResFmt(@SUnknownProperty, [PropName]);
  end;
  SetOrdProp(Instance, PropInfo, Value);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MySetPropertyColor(Edit1,'Color',clred);
end;
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
WIng2005

Registriert seit: 20. Mär 2006
Ort: Thüringen
388 Beiträge
 
Delphi XE Starter
 
#17

Re: Eigenschaften unterschiedlicher Objekte ändern

  Alt 7. Okt 2008, 12:00
Ja, vielen Dank. Hatte zwischenzeitlich den Hinweis von Apollonius umgesetzt, was dann ungefähr deinem Besipiel entspricht.
Ich verstehe nur den Unterschied zwischen SetOrdProd und SetSetProd nicht ganz. Gibt es zur Typinfo ne bessere Dokumentation, als die Delphi-Hilfe bereitstellt? Möchte es nicht nur blind übernehmen...

Vielen Dank für eure Hilfe!
MFG
Steffen
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#18

Re: Eigenschaften unterschiedlicher Objekte ändern

  Alt 7. Okt 2008, 12:14
Die RTTI von Delphi ist sehr schlecht dokumentiert. Den Unterschied zwischen den Funktionen sagt hier schon der Name:
SetOrdProp = set ordinal property = ordinale (= Zahl-) Eigenschaft setzen
SetSetProp = set set property = Mengen-Eigenschaft setzen
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
WIng2005

Registriert seit: 20. Mär 2006
Ort: Thüringen
388 Beiträge
 
Delphi XE Starter
 
#19

Re: Eigenschaften unterschiedlicher Objekte ändern

  Alt 7. Okt 2008, 12:18
Vielen Dank, wenn du nun noch ein Beispiel für eine Mengeneigenschaft für mich hast, bin ich schon glücklich....(könnte man z.B. Anchors als Mengeneigenschaft sehen?)

Nochmals danke!!

MFG
Steffen
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#20

Re: Eigenschaften unterschiedlicher Objekte ändern

  Alt 7. Okt 2008, 12:20
Ja, der Typ TAnchors ist ein klassischer Mengen-Typ.
Zitat von Controls.pas:
Delphi-Quellcode:
  
TAnchorKind = (akLeft, akTop, akRight, akBottom);
TAnchors = set of TAnchorKind;
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 03:08 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