AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Object Property Values zur Laufzeit erzeugen

Ein Thema von bogdan · begonnen am 29. Okt 2013 · letzter Beitrag vom 2. Nov 2013
Antwort Antwort
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Object Property Values zur Laufzeit erzeugen

  Alt 30. Okt 2013, 09:26
[OT]Falsch.[/OT]
Richtig. Aber solche Umwege waren wohl nicht beabsichtigt.

bogdan, frage notfalls nochmal nach.

Zwei Suchtipps in der DP: "PropertyByName" (ist keine reale Funktion, führt aber zu ein paar Informationen) und falls Du Delphi 2010 oder neuer hast, dann "neue RTTI"
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
bogdan

Registriert seit: 15. Apr 2013
77 Beiträge
 
#2

AW: Object Property Values zur Laufzeit erzeugen

  Alt 30. Okt 2013, 13:21
Ich benutze die XE3 Version.

SetPropValue(Label1, 'Caption', 'test'); funktioniert!
SetObjectProp(Label1, 'Font', Functionsaufruf mit TObject als Rückgabewert); funktioniert!

Leider stehe ich bei meinem Ansatz auf dem Schlauch:

zb. Font.Size ändern
aufgerufen mit OnClick Methode:
SetPropertyObject('Font', 'Size', '12');
Delphi-Quellcode:
procedure SetPropertyObject(APropName, APropSub, AValue: String);
var aClass : TPersistentClass;
    aObject : TObject;
    x, i : Integer;
    PropInfo: PPropInfo;
    List: TPropList;
begin
  RegisterClasses([TFont, TMargins, TPen]);
  aClass := FindClass('T' + APropName);
  if aClass.InheritsFrom(TObject) then aObject := aClass.Create; // wäre ja das gleiche wie: Font := TFont.Create;

  x := GetPropList(PTypeInfo(aObject.ClassInfo), tkAny, @List);

  for i := 0 to x - 1 do
    if List[i]^.Name = APropSub then
    begin
      SetObjectProp(aObject, APropSub, AValue); // dachte könnte man so lösen, "ähnlich" wie Font.Size := AValue;
    end;
end;
Nur das AValue ein String ist und SetObjectProp hier einen TObject erwartet.

Dann habe ich mit SetPropValue(aObject, APropSub, AValue); probiert. Aber hier bekomme ich eine Exception.

Vielleicht ist mein Ansatz komplett falsch?
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Object Property Values zur Laufzeit erzeugen

  Alt 30. Okt 2013, 13:55
Ich kann Dir nicht ganz folgen, was Du machen willst. (Die Zeit ist auch etwas knapp.)

Font ist ja ReadOnly. Vielleicht (sicher) hängt es damit zusammen. Warum willst Du überhaupt ein neues Font-Objekt erzeugen und was wird mit dem alten?

Ich hänge Dir mal meine ssProps.pas an.
Es ist immer noch Baustelle und nicht aufgeräumt, aber vielleicht kannst Du irgendwas entnehmen (insb. evtl. bei PropInfo.IsWritable).

Was vielleicht mal interessant wäre ist wäre, wie Dein endgültiger Code in Deiner Anwendung aussehen soll. Schreib einfach mal die Anweisungen auf, die Du dann veranlassen willst wenn Deine Funktionen funktionieren würden.
Ich weiß noch nicht, was Du mit dem Font machen willst.
Angehängte Dateien
Dateityp: pas ssProps.pas (36,2 KB, 9x aufgerufen)
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#4

AW: Object Property Values zur Laufzeit erzeugen

  Alt 30. Okt 2013, 19:04
Also ich verstehe auch nicht so recht, worum es dir geht. Du möchtest die Fonteigenschaften bestimmter Labels zur Laufzeit ändern? Kein Problem: Label1.Font.Color := clGreen; Dazu benötigst du kein zusätzliches Font-Objekt, das existiert bereits im Label-Objekt. Wie du die zu ändernden Labels findest, ist wieder ein ganz anderes Problem, aber wenn du sie gefunden hast, änderst du Properties wie sonst auch durch entsprechende Zuweisung. Und wenn deine Labels auch erst zur Laufzeit erzeugt werden, dann mußt du dafür Sorge tragen, daß du ihnen entsprechende Bezeichner spendierst, damit du sie später wiederfinden kannst.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#5

AW: Object Property Values zur Laufzeit erzeugen

  Alt 30. Okt 2013, 21:16
Vielleicht von allen Objekten mit einer 'Font'-Eigenschaft? Also, egal wovon abgeleitet? Wenn es eine Propert 'Font' gibt, dann mach den Font grün!
  Mit Zitat antworten Zitat
bogdan

Registriert seit: 15. Apr 2013
77 Beiträge
 
#6

AW: Object Property Values zur Laufzeit erzeugen

  Alt 31. Okt 2013, 14:54
Ich versuche es nochmal:

zb.: Eigenschaften eines TLabel werden zur Laufzeit geändert:

TLabel.Color
funktioniert mit SetPropValue(TLabel, 'Color', StringToColor('clBlue'));

oder

TLabel.Align
funktioniert mit SetPropValue(TLabel, 'Color', 'alTop');

was nicht funktioniert ist:
TLabel.Font.Color
also so geht das nicht SetPropValue(TLabel, 'Font.Color', StringToColor('clBlue'));

geht aber so:
SetObjectProp(TLabel, 'Font', SetProperty_Font);

also mit einem Functionsaufruf:

Delphi-Quellcode:
function SetProperty_Font:TObject;
var A : TFont;
begin
  A := TFont.Create;
  A.Color := clBlue;
  A.Name := 'Tahoma';
  A.Size := 12;
  Result := A;
end;
oder weitere Eigenschaften eines TShapes ändern:

TShape.Shape
funktioniert mit SetPropValue(TLabel, 'Shape', 'stCircle');

oder

TShape.Height
funktioniert mit SetPropValue(TLabel, 'Height', StrToInt(100));

was nicht funktioniert ist:
TShape.Pen.Color
also so geht das nicht SetPropValue(TShape, 'Pen.Color', StringToColor('clBlue'));

geht aber so:
SetObjectProp(TShape, 'Pen', SetProperty_Pen);

also auch wieder mit einer Function:

Delphi-Quellcode:
function SetProperty_Pen:TObject;
var A : TPen;
begin
  A := TPen.Create;
  A.Color := clBlue;
  A.Width := 10;
  A.Style := psDot;
  Result := A;
end;
Die Funktionen können mit den diversen Eigenschaften erweitert und die Parameter der Eigenschaften auch variabel geändert werden. Das ist jetzt nicht das Problem.

Das Problem ist:

In den diversen Objekten wie TLabel, TEdit, TStringGrid, TShape, TPanel, usw. gibt es Eigenschaften'.'Eigenschaften, die ich dann in einer Funktion erst mal selbst zerlegen muss. Und genau das möchte ich nicht.

Einen fertigen Code habe ich nicht, da ich jetzt schon die unfeine Lösung mit den Funktionen habe und ich das so nicht anwenden möchte.

Anderst weiß ich nicht wie ich es erklären soll.
Kann aber sein, dass ich für die Lösung einen komplett falschen Ansatz habe oder ich checke es einfach nicht wie ich auf die '.'Eigenschaften zugreifen muss.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Object Property Values zur Laufzeit erzeugen

  Alt 31. Okt 2013, 16:17
Ich habe dafür eine Funktion geschrieben. Sieh mal in der oben angehängten pas nach GetSubObject.

Das ist Teil meines Frameworks (http://www.delphipraxis.net/173360-s...framework.html), mit dem ich im Rahmen des Databinding auch Unterobjekte auflösen kann (Label1.Font.Color).

Ganz ohne eigene Funktion dürfte das m.E. nicht funktionieren.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#8

AW: Object Property Values zur Laufzeit erzeugen

  Alt 31. Okt 2013, 18:22
Ich frage mich wirklich, was das soll.

Ich frage, weil das nun gar nichts mit OOP zu tun hat.
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz