AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Eigenschaften auf "Vorhandensein" prüfen?
Thema durchsuchen
Ansicht
Themen-Optionen

Eigenschaften auf "Vorhandensein" prüfen?

Ein Thema von moelski · begonnen am 15. Jan 2009 · letzter Beitrag vom 15. Jan 2009
Antwort Antwort
Seite 1 von 2  1 2      
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#1

Eigenschaften auf "Vorhandensein" prüfen?

  Alt 15. Jan 2009, 18:29
Moin !

Wir nutzen in unserer Anwendung TChart und dort gibt es mehrere Serientypen. Nun haben aber nicht alle Serientypen die gleichen Einstellungen. Wir nutzen weiterhin die ChartListBox von TChart um die in einem Chart befindlichen Serien anzuzeigen. Das Teil schaut so (das in der Mitte):
siehe Anhang

Dort haben wir ein Popupmenü hinterlegt welches dann bestimmte Einstellungen für die Serie bereit hält wie z.B. Farbe, Strichstärke, Grid an / aus, etc.
Bis jetzt haben wir nur einen Serientypen verwendet. Da war es einfach weil man das Menü genau auf diese Serie zuschneidern konnte. Nun wollen wir aber alle Serientypen verfügbar machen.

Nun wäre es etwas müßig immer über eine Routine zu schauen welche Eigenschaften unserer Popup bietet und was man davon auf eine Serie anwenden kann. Geht das irgendwie automatisch?

Bsp: Nehmen wir mal die Serientypen FastLine und und Area. Der Typ FastLine bietet eine Einstellung "Draw All" welche der Serientyp Area nicht bietet. Gibt es nun eine Möglichkeit den Menüeintrag automatisch zu disablen wenn diese Eigenschaft nicht verfügbar ist?

Es ginge sicherlich über eine Typenprüfung. Also irgendwie so ...
Button_DrawAll.Enabled := Serie in [TFastLine] Aber das würde einen enormen Aufwand bedeuten weil man ja überall erstmal nachsehen müsste was geht und nicht. Bei den 70 Serientypen von TChart ist das müssig ...

Gibt es da nicht so einen Weg:
Button_DrawAll.Enabled := Serie(Property).available Ok so geht das ganz sicher nicht, aber ich wollte es nur mal deutlich machen was ich meine. Also quasi eine Zeile Code die selber prüft ob der Serientyp eine Eigenschaft hat oder nicht. Geht das ?
Miniaturansicht angehängter Grafiken
design-time_window_316.png  
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Eigenschaften auf "Vorhandensein" prüfen?

  Alt 15. Jan 2009, 18:34
Zitat von moelski:
Gibt es da nicht so einen Weg:
Button_DrawAll.Enabled := Serie(Property).available Ok so geht das ganz sicher nicht, aber ich wollte es nur mal deutlich machen was ich meine. Also quasi eine Zeile Code die selber prüft ob der Serientyp eine Eigenschaft hat oder nicht. Geht das ?
Ja, hier wird das Prinzip beschrieben:

Run-Time Type Information In Delphi - Can It Do Anything For You?
http://www.blong.com/Conferences/Bor...CommonAncestor

Das Beispiel auf dieser Seite sucht nach Enabled Properties
Delphi-Quellcode:
procedure DisableThem(Comps: array of TComponent);
var
  Loop: Integer;
  PropInfo: PPropInfo;
begin
  for Loop := Low(Comps) to High(Comps) do
  begin
    { Get info record for Enabled property }
    PropInfo := GetPropInfo(Comps[Loop].ClassInfo, 'Enabled');
    { If property exists, set value to False }
    if Assigned(PropInfo) then
      SetOrdProp(Comps[Loop], PropInfo, Longint(False));
  end;
end;
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Eigenschaften auf "Vorhandensein" prüfen?

  Alt 15. Jan 2009, 19:03
Moin !

Jung ik zieh mein Hut

Das geht ja noch einfacher als gedacht:
Delphi-Quellcode:
procedure TLVMainForm.PopupSeriesPopup(Sender: TObject);
Var Serie : TChartSeries;
    PropInfo : PPropInfo;
begin
  Serie := ChartListBox1.SelectedSeries;
  if (Serie = NIL) Then Exit;

  // Serie.GetVertAxis.Maximum -> Serie.GetVertAxis.ClassInfo
  { Get info record for Enabled property }
  PropInfo := GetPropInfo(Serie.ClassInfo, 'DrawAllPoints');
  { If property exists, set value to False }
// if Assigned(PropInfo) then
// DrawAll1.Caption := 'Text : ' + FloatToStr(Serie.GetVertAxis.Maximum);
  DrawAll1.Enabled := Assigned(PropInfo);
end;
Mit zwei zeilen Code kann man das abhandeln. Hab jetzt schon mit 4-5 Properties getestet und geht wunderbar!
Das spart mir mal wieder ganz ganz viel Zeit.

Drum sag ich DANKE
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#4

Re: Eigenschaften auf "Vorhandensein" prüfen?

  Alt 15. Jan 2009, 19:49
Hi!

Könntest du das Bild bitte noch in den Anhang packen?
Dann bleibt es uns auch erhalten, wenn der externe Server mal down ist und die Ladezeit des Threads verkürzt sich bestimmt auch...

Danke!

Ciao, Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Eigenschaften auf "Vorhandensein" prüfen?

  Alt 15. Jan 2009, 19:51
Moin !

Jo haste Recht. Is erledigt.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Eigenschaften auf "Vorhandensein" prüfen?

  Alt 15. Jan 2009, 19:55
Hallo Dominik,

die (überladene) Funktion IsPublishedProp aus der Unit TypInfo macht den Code noch ein wenig lesbarer.

Gruß Hawkeye
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Eigenschaften auf "Vorhandensein" prüfen?

  Alt 15. Jan 2009, 20:01
Moin Hawkeye,

na nu bin ich abba platt. Da hab ich ja wirklich meinen Einzeiler.



DrawAll1.Enabled := IsPublishedProp(Serie, 'DrawAllPoints');
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Eigenschaften auf "Vorhandensein" prüfen?

  Alt 15. Jan 2009, 20:53
Moin !

Nu is da doch noch ein Problem ...

Folgender Code klappt:
Delphi-Quellcode:
procedure TLVMainForm.PopupSeriesPopup(Sender: TObject);
Var Serie : TChartSeries;
    PropInfo : PPropInfo;
begin
  // RTTI Funktion
  // -> [url]http://www.blong.com/Conferences/BorConUK98/DelphiRTTI/CB140.htm[/url]

  Serie := ChartListBox1.SelectedSeries;
  if (Serie = NIL) Then Exit;

  // Serie.GetVertAxis.Maximum -> Serie.GetVertAxis.ClassInfo
  DrawAll1.Enabled := IsPublishedProp(Serie, 'DrawAllPoints');
Wenn die Serie die Eigenschaft DrawAllPoints hat dann wird der Button enabled.

Aber wie kann ich nun drauf zugreifen. Ich will ja auch den aktuellen Status ermitteln.
Also DrawAll1.Checked = Series.DrawAllPoints.

Nun hat aber TChartSeries keine Propertie DrawAllPoints. Das tätte nur TFastLineSeries. Ich müsste also Typecasten. Aber dann hab ich wieder das Problem wie vorher das ich mich um alles und jeden kümmern muss.

Gibts für dieses Problem auch eine Lösung?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Eigenschaften auf "Vorhandensein" prüfen?

  Alt 15. Jan 2009, 21:04
Also so gehts leider ned ...

Delphi-Quellcode:
  if IsPublishedProp(Serie, 'DrawAllPoints') then
    DrawAll1.Checked := TComponent(Serie).DrawAllPoints;
Auch so ned
Delphi-Quellcode:
  if IsPublishedProp(Serie, 'DrawAllPoints') then
    DrawAll1.Checked := TChartSeries(Serie).DrawAllPoints;
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#10

Re: Eigenschaften auf "Vorhandensein" prüfen?

  Alt 15. Jan 2009, 21:06
Ich meine da gibts sowas wie GetPropValue oder so
  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 21:17 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