Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Object Property Values zur Laufzeit erzeugen (https://www.delphipraxis.net/177292-object-property-values-zur-laufzeit-erzeugen.html)

bogdan 29. Okt 2013 20:37

Delphi-Version: 5

Object Property Values zur Laufzeit erzeugen
 
Alle Komponenten werden zur Laufzeit erzeugt. Mit SetPropValue(AComponent, APropName, APropValue) setze ich die Eigenschaften der Komponenten.

Mit SetObjectProp(aObject, APropSub, AValue) setze ich dann die Eigenschaft eines TFont Objektes.
Das Value wird mit der folgenden Funktion zusammen gesetzt:

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;
Diese Funktion würde ich gerne aber zur Laufzeit erzeugen wollen, da es ja noch andere Objekte mit Eigenschaften gibt.
Mein Ansatz wäre wie folgt:

Delphi-Quellcode:
function SetPropertyObject(APropName, APropSub, AValue: String): TObject;
var aClass : TPersistentClass;
    aObject : TObject;
    count, i : Integer;
    List: TPropList;
begin
  aClass := FindClass('T' + APropName);
  if aClass.InheritsFrom(TObject) then aObject := aClass.Create;
  count := GetPropList(PTypeInfo(aObject.ClassInfo), tkAny, @List);
  for i := 0 to count - 1 do
    if List[i]^.Name = APropSub then
      SetObjectProp(aObject, APropSub, ???);
       // und hier hört's bei mir auf
end;
Vielleicht hat jemand einen Tip?

Perlsau 29. Okt 2013 21:53

AW: Object Property Values zur Laufzeit erzeugen
 
Eine Function zur Laufzeit erzeugen? Wie soll das gehen? Du hast zur Laufzeit eine compilierte Exe-Datei, da kannst du keine neue Function mehr reinpacken.

stahli 29. Okt 2013 22:37

AW: Object Property Values zur Laufzeit erzeugen
 
Erkläre mal genauer was Du machen willst.

Man kann verschiedene Objekte dynamisch erzeugen, deren Eigenschaften setzen und ggf. Methoden aufrufen.
Zur Laufzeit Funktionen dynamisch zu bauen ist aber nicht möglich (nur eben fertige Methoden anhand deren Namen aufzurufen).

Sage auch mal, welche Delphiversion Du genau nutzt. Ab Delphi 2010 gibt es einige neuere Möglichkeiten (RTTI).

bogdan 29. Okt 2013 23:05

AW: Object Property Values zur Laufzeit erzeugen
 
Sorry, habe mich etwas unverständlich ausgedrückt.

Ich meinte nicht die Funktion zur Laufzeit erzeugen, sondern die Zuweisung der Eigenschaften des Objekts. Also dass was die Function "hardcoded" ausführt möchte ich umschreiben, dass ich die .Font.Color, .Font.Size, oder .Pen.Width, .Pen.Color, etc. zur Laufzeit als Objekt erstellen und zuweisen kann.

Ich erstelle ein zb. ein TFont Objekt über ein string = APropName :
Delphi-Quellcode:
  aClass := FindClass('T' + APropName);
  if aClass.InheritsFrom(TObject) then aObject := aClass.Create;
dann liste ich die Eigenschaften und prüfe welche ich ändern möchte
Delphi-Quellcode:
 count := GetPropList(PTypeInfo(aObject.ClassInfo), tkAny, @List);
  for i := 0 to count - 1 do
    if List[i]^.Name = APropSub then
jetzt möchte ich die X Eigenschaft des TFont Objektes ändern was mit SetObjectProp(aObject, APropSub, ???) ja machbar ist.
Nur wie in ??? ein TObject mit dem String AValue zuweisen?

Hoffe es ist so besser zu verstehen.

Furtbichler 30. Okt 2013 06:36

AW: Object Property Values zur Laufzeit erzeugen
 
[OT]
Zitat:

Zitat von stahli (Beitrag 1233718)
Zur Laufzeit Funktionen dynamisch zu bauen ist aber nicht möglich

Falsch. Himitsu(?) hatte hier einen Mathe-Parser, der ASM-Sequenzen erzeugt, die zur Laufzeit abgearbeitet werden, also genau das, was Du hier in Abrede stellst.

Weiterhin hält mich niemand davon ab, ein Skript zur Laufzeit zu erzeugen, das dann zur Laufzeit abgearbeitet wird.

Ich habe in einem Projekt DWS verwendet (Delphi Web Script) und dort aus Datenbankinformationen eine Klassenhierarchie aufgebaut. Der erzeugte Scriptcode konnte dann Daten und Methoden aus dem Delphi-Code verwenden, aber auch eigenen Code erzeugen.

Ich will damit nicht sagen, das man es so machen soll, aber "Klassen, Eigenschaften, Funktionen und Methoden zur Laufzeit erstellen" geht sehr wohl.

Ach, und die billigste Methode ist die, Pascal-Quelltext erzeugen, in einer Datei speichern, mit FPC kompilieren, die DLL einladen und aufrufen. Gelingt immer.
[/OT]
Aber bogdan möchte ja eben 'nur' Eigenschaften ändern, deren Name als String vorliegt, so wie ich das sehe...

stahli 30. Okt 2013 09:26

AW: Object Property Values zur Laufzeit erzeugen
 
Zitat:

Zitat von Furtbichler (Beitrag 1233732)
[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"

bogdan 30. Okt 2013 13:21

AW: Object Property Values zur Laufzeit erzeugen
 
Ich benutze die XE3 Version.

Delphi-Quellcode:
SetPropValue(Label1, 'Caption', 'test');
funktioniert!
Delphi-Quellcode:
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:
Delphi-Quellcode:
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
Delphi-Quellcode:
SetPropValue(aObject, APropSub, AValue);
probiert. Aber hier bekomme ich eine Exception.

Vielleicht ist mein Ansatz komplett falsch?

stahli 30. Okt 2013 13:55

AW: Object Property Values zur Laufzeit erzeugen
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.

Perlsau 30. Okt 2013 19:04

AW: Object Property Values zur Laufzeit erzeugen
 
Also ich verstehe auch nicht so recht, worum es dir geht. Du möchtest die Fonteigenschaften bestimmter Labels zur Laufzeit ändern? Kein Problem:
Delphi-Quellcode:
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.

Furtbichler 30. Okt 2013 21:16

AW: Object Property Values zur Laufzeit erzeugen
 
Vielleicht von allen Objekten mit einer 'Font'-Eigenschaft? Also, egal wovon abgeleitet? Wenn es eine Propert 'Font' gibt, dann mach den Font grün!


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:52 Uhr.
Seite 1 von 2  1 2      

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