AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Type-Problem

Offene Frage von "Timelesk"
Ein Thema von Igotcha · begonnen am 16. Mär 2005 · letzter Beitrag vom 18. Nov 2006
Antwort Antwort
Seite 1 von 2  1 2   
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#1

Type-Problem

  Alt 16. Mär 2005, 11:08
Hallo zusammen,

ich passe gerade ein von Hagen hier beschriebenes modulares Programmsystem auf meine Bedürfnisse an.

Allerdings habe ich mit folgender Funktionalität Probleme:

Delphi-Quellcode:
type
  TModularForm = class(TForm)
  protected
    function GetParam(const Name: String): Variant; virtual;
    procedure SetParam(const Name: String; Data: Variant); virtual;
  public
    class procedure Register;
 // wir erweitern nun unser gemeinsammes Basis Interface
    //class function FormularName: String; virtual; abstract;
    //class function MenuPath: String; virtual; abstract;
 
    property Param[Name: String]: Variant read GetParam write SetParam; // <--- hier
  end;

...

function TModularForm.GetParam(const Name: String): Variant;
begin
  Result := TypInfo.GetVariantProp(Self, Name);
end;

procedure TModularForm.SetParam(const Name: String; Data: Variant);
begin
  TypInfo.SetVariantProp(Self, Name, Data);
end;
Ich habe entgegen dem Beispiel noch die Unit "TypInfo" in die uses-Klausel mit aufgenommen, da das Beispiel ohne diese nicht funktioniert.

Allerdings erhalte ich dann für die angegebene Zeile nun ein:

[Error] FormMain.pas(26): Incompatible types Gruß Igotcha
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 11. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: Type-Problem

  Alt 16. Mär 2005, 11:21
 procedure SetParam(const Name: String; Data: Variant); virtual; Das ist ein Fehler, IMHO.
Du solltest es so machen:
 procedure SetParam( Data: Variant); virtual;
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Type-Problem

  Alt 16. Mär 2005, 11:29
Hmmm, ich habe das gerade als "Clou" interpretiert, dass ich mit
procedure SetParam(const Name: String; Data: Variant); virtual; quasi eine "Allround-Möglichkeit" habe, um Properties innerhalb des gesamten Modulgeflechts setzen zu können...

Gruß Igotcha
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#4

Re: Type-Problem

  Alt 16. Mär 2005, 11:36
Muss Data nicht auch const sein?
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Type-Problem

  Alt 16. Mär 2005, 11:43
Zitat von jim_raynor:
Muss Data nicht auch const sein?
Ändert leider nichts

Der Cursor landet genau hinter dem "write" in der o.g. Zeile.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#6

Re: Type-Problem

  Alt 17. Mär 2005, 07:07
Tja, ich wusste das auch nicht was Borland da wiedermal geändert hat, so müsste es gehen:

Delphi-Quellcode:

    function GetParam(const Name: String): Variant; virtual;
    procedure SetParam(const Name: String; const Data: Variant); virtual;
  public
    class procedure Register;

    property Param[const Name: String]: Variant read GetParam write SetParam;
  end;
Der Index einer Property, wenn er vom Typ LongString ist, muß anscheinend jetzt immer als const deklariert werden. Ansich ist das logisch, unlogisch ist nur das man zb. in D3 auch ohne const arbeiten konnnte (wenn ich mich recht erinnere).

Zitat:
quasi eine "Allround-Möglichkeit" habe, um Properties innerhalb des gesamten Modulgeflechts setzen zu können...
Ja, so war es auch gedacht

Gruß Hagen
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Type-Problem

  Alt 17. Mär 2005, 13:31
Funktioniert jetzt, danke!
  Mit Zitat antworten Zitat
Timelesk

Registriert seit: 24. Jul 2004
72 Beiträge
 
#8

Re: Type-Problem

  Alt 16. Nov 2006, 06:59
Hallo,

ich habe meinen Code auch von Hagen und hatte das selbe Problem.
Nun funktioniert das soweit unter Delphi2006.

Aber wie kann ich jetzt Werte übergeben?
Über einen Button im MainForm rufe ich das nach dem Laden des Formulars auf:
modul1.SetParam('test', Button1.Caption); Und danach teste ich anhand eines weiteren Buttons im Modul, ob der Wert übergeben wurde:
label1.caption := string(ModularForm1.GetParam('test')); Leider gibt er mir aber bereits bei SetParam diese Fehlermeldung aus: Eigenschaft test existiert nicht

Wo muss man denn das noch definieren?


Vielen Dank
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: Type-Problem

  Alt 16. Nov 2006, 09:32
Zitat von negaH:
Delphi-Quellcode:
    function GetParam(const Name: String): Variant; virtual;
    procedure SetParam(const Name: String; const Data: Variant); virtual;
  public
    class procedure Register;

    property Param[const Name: String]: Variant read GetParam write SetParam;
  end;
Ich habe eine Frage dazu: In der OH steht aber vermerkt, dass Property Getter/Setter nicht virtuell sein dürfen. Ich habe aufgrund dessen extra mein Design ändern müssen. Ist dies hinfällig?
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#10

Re: Type-Problem

  Alt 16. Nov 2006, 20:27
Hm, das wäre mir absolut neu. Mich interessiert als Refernez nur das was die RTTI und somit der Compiler kann. In TypInfo.pas kann man sehr wohl lesen, als verwendeter realer Source!!, das eine Property auch virtuelle Getter/Setter haben kann.

Das spielt aber auch keine Rolle wenn es nicht so wäre. Dann ändern wir es so um das die Getter/Stetter statisch sind und intern als Dispatcher an 2 virtuelle Methoden weiterreichen.

Mich würde aber mal interessieren WO du das in der OH gelesen haben willst. Weil es dort nicht explizit steht und nur Beispiele mit statischen Methoden drinenstehen, heist dies noch lange nicht das es nicht geht. Ich programmiere seit es Delphi gibt (genauer seit BP4.0) und eine Setter/Getter Methode konnte schon immer statisch oder virtuell aber nicht dynamisch und somit ergo auch keine Nachrichtenmethode eg. als message deklariert sein. Sie darf sogar eine abstrakte Methode sein, und damit eben auch virtuell (abstrakte statische Methoden machen keinen Sinn).

Aus Sicht der Logik ist es auch sinnvoll, wenn man schon überschreibbare Methoden kennt, die Setter/Getter Methoden, die ja wiederum nur ein weiteres Qualitätsmerkmal der OOP umsetzen -> Properties, ebenfalls virtualisieren zu können. Warum sollten gerade auf die neueren Properties nicht die Regeln der OOP gelten ? (das wäre ein unlogischer Schritt von Borland gewesen den ich wohl am meisten kritisieren würde). Das man die Getter/Setter nicht dynamisch deklarieren kann ist eine Frage von Effizienz im Code. Sie wären unnötig langsam und brächten keinen Vorteil da man zu 99.99% der Zeit eine Property mit Getter/Setter Methoden sofort implementiert, statt mit dem Ziele sie über dynamische Methoden erst viel später durchimplementieren zu wollen. Hier zählt also der Kompromis von Aufwand und Nutzen der gegen dynamsiche Setter/Getter spricht. Der Sinn einer dynamsichen Methode besteht in der OOP darin das der Initial Entwickler einen Schnittstellenrumpf vorgeben kann ohne diese real implementieren zu müssen. Im Falle der Properties sind dynmische Methoden absolut sinnfrei, bzw. zu 99.9% sinnfrei
Das man dabei aber diese Methoden nicht als Messagemethoden deklarieren kann ist ebenfalls sinnvoll da sie mit einem Messaging nichts zu tuen haben. Davon abgesehen sind Messagemethoden eng verknüpft mit den dynamischen Methoden, infakt es sind dynamische Methoden mit explizierter Angabe der Slotnummer der DMT im Source (früher in BP konnte man die Slotnummer auch bei normalen dynamsichen Methoden vorgeben, heute geht dies nicht mehr, schade). Ergo: da dynamische Setter/Getter nicht gehen, können auch Messagemethoden nicht funktionieren.

Wie man sieht: die Regeln der OOP und wie die Borlanianer die VCL konstruiert haben unterwerfen sich zwingender Logik. Einer Logik die man selber nachvollziehen kann und mit der wir quasi schon erraten können was in der VCL geht oder nicht geht.

Ich schlage bei sowas immer vor: einfach selber mal ausprobieren statt sich einfach auf Meinungen Andere zu verlassen (davon gibts nämlich ne Menge Pseudowissen).

Gruß Hagen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 02:21 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