Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Neue Komponente / Properties speichern ? (https://www.delphipraxis.net/30332-neue-komponente-properties-speichern.html)

teebee 23. Sep 2004 19:16

Re: Neue Komponente / Properties speichern ?
 
Zitat:

Zitat von Gruber_Hans_12345
Interessante Idee, aber wie kann ich eine private methode überschreiben ?

Einfach neu deklarieren, sollte funktionieren. Falls doch nicht (ich habe es selber noch nicht probiert, habe aber irgendwo was in der Art schonmal gesehen), kannst Du ja eine Funktion mit einem anderen Namen implementieren und das Property neu deklarieren.
Zitat:

Zitat von Gruber_Hans_12345
Ich will die Farbe nicht auf die Farbe des Forms setzen (könnte ja dann auch Parentcolor verwenden)

Parentcolor gibt aber nicht die Farbe des Parents wieder :wink:

Gruß, teebee

Gruber_Hans_12345 24. Sep 2004 09:06

Re: Neue Komponente / Properties speichern ?
 
Zitat:

Zitat von teebee
Parentcolor gibt aber nicht die Farbe des Parents wieder :wink:
Gruß, teebee

Doch, ParentColor auf True gesetzt und Color wird automatisch auf die Farbe des Vorgängers gesetzt !
"To have a control use the same color as its parent control, set ParentColor to true If ParentColor is false the control uses its own Color property."

Gruss
Hans

Stevie 24. Sep 2004 09:41

Re: Neue Komponente / Properties speichern ?
 
Weil mich die Sache interessiert hat, hab ich mal ein bisschen rumprobiert. Hier das Ergebnis:
Delphi-Quellcode:
unit EditEx;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, StdCtrls, Graphics;

type
  TEditEx = class(TEdit)
  private
    FColor: TColor;
    FCursor: TCursor;
    FOnlyShow: Boolean;
    function GetColor: TColor;
    function GetCursor: TCursor;
    function IsColorStored: Boolean;
    function IsCursorStored: Boolean;
    procedure SetColor(const Value: TColor);
    procedure SetCursor(const Value: TCursor);
    procedure SetOnlyShow(const Value: Boolean);
  published
    property Color: TColor read GetColor write SetColor stored IsColorStored default clWindow;
    property Cursor: TCursor read GetCursor write SetCursor stored IsCursorStored default crDefault;
    property OnlyShow: Boolean read FOnlyShow write SetOnlyShow;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Beispiele', [TEditEx]);
end;

{ TEditEx }

function TEditEx.GetColor: TColor;
begin
  Result := inherited Color;
end;

function TEditEx.GetCursor: TCursor;
begin
  Result := inherited Cursor;
end;

function TEditEx.IsColorStored: Boolean;
begin
  Result := not ParentColor and not OnlyShow;
end;

function TEditEx.IsCursorStored: Boolean;
begin
  Result := not OnlyShow;
end;

procedure TEditEx.SetColor(const Value: TColor);
begin
  if not OnlyShow then
    inherited Color := Value;
end;

procedure TEditEx.SetCursor(const Value: TCursor);
begin
  if not OnlyShow then
    inherited Cursor := Value;
end;

procedure TEditEx.SetOnlyShow(const Value: Boolean);
begin
  if FOnlyShow <> Value then
  begin
    FOnlyShow := Value;
    if OnlyShow then
    begin
      FColor := inherited Color;
      FCursor := inherited Cursor;
      inherited Color := clBtnFace;
      inherited Cursor := crArrow;
    end
    else
    begin
      inherited Color := FColor;
      inherited Cursor := FCursor;
    end;
  end;
end;

end.

Muetze1 24. Sep 2004 09:42

Re: Neue Komponente / Properties speichern ?
 
Moin!

Trotzdem gibt ParentColor nicht die Farbe des Parents wieder sondern es stellt nur ein Flag da. Es gibt nur True oder False wieder, aber keinen Farbwert...

Und genau das war gemeint - was die Color Eigenschaft abhängig von dem Wert enthält ist die andere Frage...

MfG
Muetze1

teebee 24. Sep 2004 09:42

Re: Neue Komponente / Properties speichern ?
 
OK, sorum hast Du natürlich recht...

Was das 'Überschreiben' der privaten Methoden angeht, habe ich mal selber etwas rumprobiert. Man kann auf jeden Fall eine statische private Methode der Basisklasse neu deklarieren. Die neue Methode lässt sich auch von einer abgeleiteten Instanz aufrufen. In Deinem Fall soll aber die neu deklarierte Methode von einer Eigenschaft aufgerufen werden, die sich in der Basisklasse befindet. Das geht leider nicht, es wird die Methode der Basisklasse aufgerufen.
Man müsste auch die Eigenschaft neu deklarieren. Dazu wiederum müsste man auch das entsprechende private Feld neu deklarieren. Andere Methoden aus der Basisklasse würden dann aber nicht auf das richtige (neue) Feld zugreifen.

Schade, geht also wohl doch nicht :(

Gruß, teebee

Stevie 24. Sep 2004 09:47

Re: Neue Komponente / Properties speichern ?
 
Zitat:

Zitat von teebee
Was das 'Überschreiben' der privaten Methoden angeht, habe ich mal selber etwas rumprobiert. Man kann auf jeden Fall eine statische private Methode der Basisklasse neu deklarieren. Die neue Methode lässt sich auch von einer abgeleiteten Instanz aufrufen. In Deinem Fall soll aber die neu deklarierte Methode von einer Eigenschaft aufgerufen werden, die sich in der Basisklasse befindet. Das geht leider nicht, es wird die Methode der Basisklasse aufgerufen.
Man müsste auch die Eigenschaft neu deklarieren. Dazu wiederum müsste man auch das entsprechende private Feld neu deklarieren. Andere Methoden aus der Basisklasse würden dann aber nicht auf das richtige (neue) Feld zugreifen.

Schade, geht also wohl doch nicht :(

Falsch, guckst du oben. :zwinker:

teebee 24. Sep 2004 09:48

Re: Neue Komponente / Properties speichern ?
 
Zitat:

Zitat von teebee
Andere Methoden aus der Basisklasse würden dann aber nicht auf das richtige (neue) Feld zugreifen.

Wie ich an Stevies Posting sehe, scheint das in diesem Fall egal zu sein, habe mir noch nicht die Mühe gemacht, zu schauen, ob noch irgendwo in der Vorgängerklasse auf FColor oder FCursor zugegriffen wird.

Gruß, teebee

Stevie 24. Sep 2004 09:53

Re: Neue Komponente / Properties speichern ?
 
Zitat:

Zitat von teebee
Wie ich an Stevies Posting sehe, scheint das in diesem Fall egal zu sein, habe mir noch nicht die Mühe gemacht, zu schauen, ob noch irgendwo in der Vorgängerklasse auf FColor oder FCursor zugegriffen wird.

:warn: Meine privaten Felder haben nix mit den privaten Feldern der Vorgängerklassen zu tun!!! Sie heißen bloß genauso. Wenn also irgendwo in TControl auf FColor zugegriffen wird, dann juckt das nicht, ob in der Klasse TEditEx irgendwas da drin steht, denn er hat sein eigenes FColor. Private Felder werden nicht überschrieben, sie sind für jede Klasse gekapselt.

teebee 24. Sep 2004 10:13

Re: Neue Komponente / Properties speichern ?
 
Zitat:

Zitat von Stevie
Meine privaten Felder haben nix mit den privaten Feldern der Vorgängerklassen zu tun!!! Sie heißen bloß genauso. Wenn also irgendwo in TControl auf FColor zugegriffen wird, dann juckt das nicht, ob in der Klasse TEditEx irgendwas da drin steht, denn er hat sein eigenes FColor. Private Felder werden nicht überschrieben, sie sind für jede Klasse gekapselt.

Eben das meine ich. Wenn die neue Klasse nun eine Methode aufruft, die nicht selber überschrieben wurde, die aber so ein überschriebenes Feld verändert, wird das 'alte' Feld der Vorgängerklasse beeinflusst, und man hat Inkonsistenzen zwischen beiden Klassen. Also müsste man noch alle Methoden, die auf solche Felder zugreifen, mitkopieren, damit sichergestellt ist, dass immer die neuen gemeint sind.

In diesem Fall hier scheint es ja egal zu sein, prinzipiell kann es aber Probleme machen.

Gruß, teebee

Stevie 24. Sep 2004 10:31

Re: Neue Komponente / Properties speichern ?
 
Zitat:

Zitat von teebee
Wenn die neue Klasse nun eine Methode aufruft, die nicht selber überschrieben wurde, die aber so ein überschriebenes Feld verändert, wird das 'alte' Feld der Vorgängerklasse beeinflusst, und man hat Inkonsistenzen zwischen beiden Klassen. Also müsste man noch alle Methoden, die auf solche Felder zugreifen, mitkopieren, damit sichergestellt ist, dass immer die neuen gemeint sind.

Die neuen privaten Felder FColor und FCursor dienen "nur" zum Ablegen der alten Werte wenn man auf OnlyShow = True wechselt. Wenn man natürlich auf TEdit castet, dann kann man die Farben ändern usw, aber wenn man mit TEditEx arbeitet, dann ist das nicht möglich. (Vielleicht hätte ich sie FOldColor und FOldCursor nennen sollen um solche Verwirrung auszuschließen... ;-))


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:38 Uhr.
Seite 2 von 3     12 3      

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