AGB  ·  Datenschutz  ·  Impressum  







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

Gibts sowas wie findproperty?

Ein Thema von SearchBot · begonnen am 6. Jul 2013 · letzter Beitrag vom 7. Jul 2013
Antwort Antwort
Seite 1 von 2  1 2      
SearchBot

Registriert seit: 27. Jun 2004
Ort: N-W vom Bodensee
272 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Gibts sowas wie findproperty?

  Alt 6. Jul 2013, 22:52
Delphi-Version: XE
Ich bin gerade am suchen, aber ich weiß nicht wie ich es nennen soll, daher fallen die Suchergebnisse daneben...

Ich möchte bei einer ganzen Reihe von TEdit die Eigenschaft text auf (leer) setzen. Also im Prinzip von (dasEdit).text:=''; Dann auch noch checked diverser TCheckbox auf false.

Also denke ich mir, ich mache eine

Code:
Procedure SetAll(propertyname:String; aufWert:string; vonComponents:array of TComponent);
Var i:integer;
begin
 for i:=0 to count(vonComponents)-1 do
  vonComponents[i].propertyname:=aufWert;
end;
Wobei natürlich zuvor aufWert an den jeweiligen Typen angepasst wird.

Mein Unwissen besteht jetzt darin, wie ich den in propertyname übergebenen Text so hinbekomme, daß es funktioniert.
Also sowas wie findcomponent('TForm1') ...??
  Mit Zitat antworten Zitat
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Gibts sowas wie findproperty?

  Alt 6. Jul 2013, 23:12
Hallo,

im einfachsten Falle könntest du deine Komponenten durchnummerieren:
Code:
edit1
edit2
usw.
und dann gehst du in einer (z.B. for-) Schleife deine Komponenten durch:
Delphi-Quellcode:
for i:=1 to EditCount do
  (TForm1.FindComponent('Edit' +IntToStr(i)) as TEdit).Text := '';
for i:=1 to CheckBoxCount do
  (TForm1.FindComponent('CheckBox' +IntToStr(i)) as TCheckBox).Checked := aufWert;
Gruß,
MrMooed
"Unsere Luft hat einen Vorteil: Man sieht was man einatmet" - Ein Chinese
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#3

AW: Gibts sowas wie findproperty?

  Alt 6. Jul 2013, 23:31
Hallo,

Zitat:
Gibts sowas wie findproperty?
Ist mir nichts bekannt.

Vielleicht hilft folgender Ansatz Dein Problem zu lösen:
Delphi-Quellcode:
procedure SetValue (C : array of TCheckBox; const Value : Boolean); overload;
var
  i : Integer;
begin
  for i := 0 to High (C) do
    C [i].Checked := Value
end;

procedure SetValue (C : array of TEdit; const Value : string); overload;
var
  i : Integer;
begin
  for i := 0 to High (C) do
    C [i].Text := Value
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetValue ([CheckBox1, CheckBox3], False);
  SetValue ([CheckBox2, CheckBox4], True);
  SetValue ([Edit1, Edit2], '');
  SetValue ([Edit3], 'Hallo Welt');
end;
Gruß
Volker Zeller
  Mit Zitat antworten Zitat
SearchBot

Registriert seit: 27. Jun 2004
Ort: N-W vom Bodensee
272 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Gibts sowas wie findproperty?

  Alt 6. Jul 2013, 23:37
Hallo,

@MrMooed:
ja diese Methode ist mir bekannt, mache ich auch schon immer so.
Aber im jetzigen Projekt haben die Felder ganz unterschiedliche Namen, weil sie auch für den Benutzer sichtbar werden - und ich möchte es halt gerne "vereinfachen"

@Volker Z.
Hm...
das mit Overload sieht gut aus...
Ich denke, das ist es.
Dankeschön
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.346 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Gibts sowas wie findproperty?

  Alt 7. Jul 2013, 00:04
Ja, es gibt so etwas wie findproperty...

Nennt sich GetPropInfo aus der Unit TypInfo. Da bekommst du einen Pointer auf diese Information (PPropInfo), so dass du über PropertyInfo.PropType^.Kind z.B. den Typ der Property heraus bekommst. Mit SetPropValue kannst du den Wert einer Property setzen. Dafür musst du nicht unbedingt vorher die Information holen, da das rein über den Namen einfach so geht, aber ich mache das vorher um, wenn es eine Klasse ist, mir diese zu holen.

So kann ich auch Font.Name setzen, da ich zuerst feststelle, dass Font vom Typ tkClass existiert, mir das Objekt hole und SetPropValue dann auf dieses Objekt anwende, sprich dort Name setze.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: Gibts sowas wie findproperty?

  Alt 7. Jul 2013, 00:18
Wie wäre es denn mit diesem hier?
Delphi-Quellcode:
procedure TForm1.SetAll(sText : string; bChecked : Boolean);
Var i : integer;
begin
  for i := 0 to ComponentCount - 1 do begin
         if Components[i] is TEdit then TEdit(Components[i]).Text := sText
    else if Components[i] is TCheckBox then TCheckBox(Components[i]).Checked := bChecked
    ;
  end;
end;
(nur hingedaddelt, nicht getestet)
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#7

AW: Gibts sowas wie findproperty?

  Alt 7. Jul 2013, 01:01
Hallo,

Zitat:
Ja, es gibt so etwas wie findproperty [...] Nennt sich GetPropInfo aus der Unit TypInfo
jaenicke, vielen Dank für die Info . Damit könnte man also meinen ersten Ansatz auch so umsetzen
Delphi-Quellcode:
uses
  System.TypInfo;

procedure SetValue (C : array of TObject; const Name : string; const Value : Variant);
var
  i : Integer;
  p : PPropInfo;
begin
  for i := 0 to High (C) do
    begin
      p := GetPropInfo (C [i], Name, []);
      if Assigned (p) then
        SetPropValue (C [i], Name, Value)
      else
        // mach was wenn nicht
    end
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetValue ([CheckBox1, CheckBox3], 'Checked', False);
  SetValue ([CheckBox2, CheckBox4], 'Checked', True);
  SetValue ([Edit1, Edit2], 'Text', '');
  SetValue ([Edit3], 'Text', 'Hallo Welt');
end;
Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#8

AW: Gibts sowas wie findproperty?

  Alt 7. Jul 2013, 09:11
Darf ich dazu noch ein paar Takte Generics einwerfen?

Delphi-Quellcode:
uses
  System.Sysutils; // wegen TProc<T>
type
  TUtilities = record
    class procedure ForIn<T: class>(const Targets: array of T; DoProc: TProc<T>); static;
  end;

class procedure TUtilities.ForIn<T>(const Targets: array of T; DoProc: TProc<T>);
var
  instance: T;
begin
  for instance in Targets do
    DoProc(instance);
end;
Damit ließe sich dein Code dann so schreiben (zwar etwas länger, aber deutlich flexibler und typsicher):

Delphi-Quellcode:
  TUtilities.ForIn<TCheckBox>([CheckBox2, CheckBox4],
    procedure (ACheckBox: TCheckBox)
    begin
      ACheckBox.Checked := True;
    end);
  TUtilities.ForIn<TCheckBox>([CheckBox1, CheckBox3],
    procedure (ACheckBox: TCheckBox)
    begin
      ACheckBox.Checked := false;
    end);
  TUtilities.ForIn<TEdit>([Edit1, Edit2],
    procedure (AEdit: TEdit)
    begin
      AEdit.Text := '';
    end);
  TUtilities.ForIn<TEdit>([Edit3],
    procedure (AEdit: TEdit)
    begin
      AEdit.Text := 'Hallo Welt';
    end);
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Gibts sowas wie findproperty?

  Alt 7. Jul 2013, 09:16
Na, wenn das nicht cool ist
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
SearchBot

Registriert seit: 27. Jun 2004
Ort: N-W vom Bodensee
272 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: Gibts sowas wie findproperty?

  Alt 7. Jul 2013, 15:23
Boah, wenn ich auf die Postzeitpunkte schaue.. alles Nachtaktivisten

Dankeschön für's mitdenken

..und Generics sind mir zu abgehoben , das blick ich nicht, ist aber bestimmt voll praktisch
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:20 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