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 1 von 3  1 23      
WIng2005

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

Eigenschaften unterschiedlicher Objekte ändern

  Alt 7. Okt 2008, 08:49
Hallo,

ich möchte zur Laufzeit die Eigenschaften (readonly und color) unterschiedlicher Objekte ändern.
Das betrifft bspw. TEdit, TMemo, TCombobox,TListbox, TJvListbox und TJvCombobox.
Mein Ansatz bisher war:

Delphi-Quellcode:
for i := 0 to Mainform.ComponentCount - 1 do
    Begin
    if ((Mainform.Components[i] is TEdit)
        or (Mainform.Components[i] is TMemo)
        or (Mainform.Components[i] is TListbox)
        or (Mainform.Components[i] is TJvListbox)
        or (Mainform.Components[i] is TJvComboBox)
        or (Mainform.Components[i] is TCombobox))
        and (((Mainform.Components [i]).tag=1)) then
        Begin
        with (Mainform.Components [i]) do
          readonly:=true; //mag er nicht : Undefinierter Bezeichner
        end;
End;end;
Leider hänge ich ein wenig an der markierten Stelle, und hoffe ihr könnt mir meinen Fehler ein wenig deutlich machen.

MFG
Steffen
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Eigenschaften unterschiedlicher Objekte ändern

  Alt 7. Okt 2008, 09:04
Mainform.Components [i] ist nur ein Zeiger, deshalb weiß der Compiler nicht, wen er da vor sich hat. Du brauchst etwas wie
Delphi-Quellcode:
if Mainform.Components[i] is TEdit then
begin
  with if Mainform.Components[i] as TEdit do
  begin
    ReadOnly := true;
  end;
Ungetestet, müsste aber etwa so gehen.

Grüße, Messie
  Mit Zitat antworten Zitat
mquadrat

Registriert seit: 13. Feb 2004
1.113 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Eigenschaften unterschiedlicher Objekte ändern

  Alt 7. Okt 2008, 09:05
Sicher, dass das zweite if da rein gehört?
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Eigenschaften unterschiedlicher Objekte ändern

  Alt 7. Okt 2008, 09:12
Wenn die Komponenten nicht denselben Vorfahren aufweisen, der genau die von dir zu veränderden Eigenschaften besitzt wirst du so nicht weiterkommen.

Eine TListBox hat keine Eigenschaft, die das beschreiben durch Benutzereingabe erluabt oder
nicht erlaubt, ich weiss nicht was du dabei vorhast.

Delphi-Quellcode:

for i := 0 to Mainform.ComponentCount - 1 do
Begin
    if ((Mainform.Components[i] is TCustomEdit) then
      TCustomEdit(Mainform.Components[i]).ReadOnly := True
    else
    if (Mainform.Components[i] is TCustomComboBox) then
      TCustomComboBox(Mainform.Components[i]).Style := csDropDownList;

End;end;
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.197 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Eigenschaften unterschiedlicher Objekte ändern

  Alt 7. Okt 2008, 09:17
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;
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
WIng2005

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

Re: Eigenschaften unterschiedlicher Objekte ändern

  Alt 7. Okt 2008, 09:22
@Tyrael Y.:Klar, mein Fehler. Würde man nur die Eigenschaft color betrachten, wie könnte man den Code im ersten Beitrag entsprechend Korrigieren? Bin auf der suche nach einer kurzen "eleganten" Lösung. Andererseits, sofern ich einigen Komponenten ein readonly geben möchte, werde ich wohl den längeren Weg gehen müssen.
Ich ging davon aus, dass die Komponenten von TObject abstammen und somit

Delphi-Quellcode:
for i := 0 to Mainform.ComponentCount - 1 do
    Begin
    if ((Mainform.Components[i] is TEdit)
        or (Mainform.Components[i] is TMemo))
        and (((Mainform.Components [i]).tag=1)) then
        Begin
        with (Mainform.Components [i]) as TObject do
          readonly:=true;
        end;
End;end;
möglich wäre. Funktioniert aber irgendwie auch nicht. Möchte erreichen, dass ich nicht für jedes Objekt eine extra Abfrage laufen lassen muss.

@Bernhard: das muss ich erstmal "sacken" lassen....

MFG
Steffen
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Eigenschaften unterschiedlicher Objekte ändern

  Alt 7. Okt 2008, 09:29
Du musst nicht jede Komponente einzeln behandeln.
Guck mal bitte nochmal meinen Code an.

Du musst den gemeinsamen Vorfahren finden bei der diese von dir gesuchte Eigenschaft
definiert wird. Somit erschlägts du in einem Schritt ganz viele Komponenten.

Edit: Die Eigenschaft Color wird in TControl definiert.

Delphi-Quellcode:

for i := 0 to Mainform.ComponentCount - 1 do
Begin
    if ((Mainform.Components[i] is TCustomEdit) then
      TCustomEdit(Mainform.Components[i]).ReadOnly := True
    else
    if (Mainform.Components[i] is TCustomComboBox) then
      TCustomComboBox(Mainform.Components[i]).Style := csDropDownList;

    if (Mainform.Components[i] is TControl) then
      TControl(Mainform.Components[i]).Color := clGreen;
End;end;
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Eigenschaften unterschiedlicher Objekte ändern

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

Grüße, Messie
  Mit Zitat antworten Zitat
WIng2005

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

Re: Eigenschaften unterschiedlicher Objekte ändern

  Alt 7. Okt 2008, 09:55
@Tyrael Y.:

TControl schein es nicht zu sein, oder aber ich habe eine Fehler im Code:

Delphi-Quellcode:

for i := 0 to Mainform.ComponentCount - 1 do
Begin
  if (Mainform.Components [i]).tag=1 then
  Begin
   if (Mainform.Components[i] is TControl) then
      TControl(Mainform.Components[i]).Color :=cl3DLight; //undefinierter Bezeichner Color

  end; //if
end;
(Die zweite Abfrage könnte man auch mit der ersten Verbinden, hier soll jedoch noch mehr rein....)

MFG
Steffen
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Eigenschaften unterschiedlicher Objekte ändern

  Alt 7. Okt 2008, 10:05
Hab es jetzt grade mal geprüft.
Color ist in TControl definiert, ist aber protected.

Die meisten Controls machen die Eigenschaft erst beim eigentlich benutztem Nachfahren published oder public. Tja da musst du jetzt genau gucken, welchen Controls du die Color Eigenschaft zuweisen möchtest und für jeden von denen nach einem gemeinsamen Vorfahren mit Color published bzw publich suchen. z.B bei TEdit ist es TEdit selbst.
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 18:36 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