Delphi-PRAXiS

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)

Gruber_Hans_12345 23. Sep 2004 15:39


Neue Komponente / Properties speichern ?
 
Hi

Hab eine eigene Komponenten (Abgeleitet von TEdit), die ein zusätzliches Property onlyShow hat.
Wenn onlyShow TRUE ist, dann wird
Delphi-Quellcode:
Cursor     := crArrow;
Color      := clBtnFace;
Alles funktioniert soweit, das einzige, was mich noch etwas stört, ist wenn ich im Designmodus onlyShow auf TRUE setze, dann wird bei der Komponente die Properites umgestellt, und AUCH im Form ABGESPEICHERT !

Kann ich das verhindern (da die Infos nun ja doppelt sind) Cursor setzen, Farbe stzen und onlyShow setzt dann wiederum beide !

Gruss
Hans

alcaeus 23. Sep 2004 15:43

Re: Neue Komponente / Properties speichern ?
 
Hi Hans,

ich weiß jetzt nicht genau warum du diese eigene Komponente hast, aber warum versuchst du nicht, ein TLabel o.ä. zu verwenden?
Zu deinem Problem: warum stört es dich dass die Werte geändert werden?
Vielleicht bring dich ja dieser Tipp weiter.

Greetz
alcaeus

Stevie 23. Sep 2004 15:47

Re: Neue Komponente / Properties speichern ?
 
Du könntest in der SetMethode deines Properties, den ComponentState abfragen und wenn der auf csDesigning befindet, die Werte nicht ändern:
Delphi-Quellcode:
procedure SetOnlyShow(const Value: Boolean);
begin
  if not (csDesigning in ComponentState) then
  begin
    Cursor := crArrow;
    Color := clBtnFace;
  end;
end;

Hansa 23. Sep 2004 16:11

Re: Neue Komponente / Properties speichern ?
 
Ich vermute mal, er will den Style eines Edit und dieses dann auf enabled := false setzen, also, daß er schon im OI festlegen kann, ob es standardmäßig editierbar ist.

Mehr gibt meine Glaskugel nicht her. 8)

Gruber_Hans_12345 23. Sep 2004 16:16

Re: Neue Komponente / Properties speichern ?
 
@Hansa, alcaeus
So ungefähr, im OnEnter hab ich noch nen Aufruf drinnen, der den Focus automatisch zum nächsten Control gibt. Ein Label wäre nicht ausreichend, da es optisch gleich sein sollte, und leicht umstellbar, wenn der User doch was eingeben soll.

@Stevie:

Werds gleich mal probieren, aber fürchte, das mit dieser Version ich im Designmodus nicht mehr erkennen welchen Status ich gesetzt habe ... (Da ja die Farbe gar nicht mehr geändert wird oder ?)

Gruss
Hans

alcaeus 23. Sep 2004 16:20

Re: Neue Komponente / Properties speichern ?
 
Zitat:

Zitat von Gruber_Hans_12345
Werds gleich mal probieren, aber fürchte, das mit dieser Version ich im Designmodus nicht mehr erkennen welchen Status ich gesetzt habe ... (Da ja die Farbe gar nicht mehr geändert wird oder ?)

Aber ShowOnly wird noch geändert, und anhand dessen kannst du wissen, in welchem Status du bist.
Ansonsten bleibt dir wohl nichts anderes übrig, als den Fehler zu akzeptieren ;)

Greetz
alcaeus

Hansa 23. Sep 2004 16:30

Re: Neue Komponente / Properties speichern ?
 
eigene Komponenten sind einfach und schwierig zugleich. :lol: deshalb mal schön langsam : Was ist mit dem Feld "ShowOnly" ? Taucht das im OI auf ? Lassen sich die Werte korrekt auf true und false setzen ?

Läßt sich die Komponente wie ein normales Edit problemlos auf eine Form ziehen, oder kommen seltsame Fehlermeldungen ?

[EDIT]@Alcaeus : wieso soll er Fehler akzeptiern ? Wo gibts denn so was ? :shock:

Gruber_Hans_12345 23. Sep 2004 17:16

Re: Neue Komponente / Properties speichern ?
 
@hansa:
Es gibt ja keine richtigen Fehler, es funktioniert alles wie es soll, das einzige, was mich persönlich stört, ist das die PRoperties, die ich in meiner Set Routine setze, im Formular abgespeichert werden, obwohl das ja ganz überflüssig ist (Farbe und Cursor wird ja dann eh von meiner Set procedure gesetzt !)
ODer aber, mit der InDesign if Abfrage, dann sieht man zur Design Zeit nicht mehr so schön, ob das Edit Control OnlyShow true oder false ist (natürlcih sieht mans im OI, aber vorher sahs man gleich an der Farbe des Edit Feldes .....)

Gruss
Hans

teebee 23. Sep 2004 18:19

Re: Neue Komponente / Properties speichern ?
 
Auch wenn mich das nicht so stören würde, vermute ich, dass es eine Lösung gibt. (Habe es allerdings noch nicht probiert...)
Ich fange mal mit 'Color' an. In der VCL ist Color folgendermaßen deklariert:
Zitat:

Zitat von VCL
property Color: TColor read FColor write SetColor stored IsColorStored default clWindow;

D.h. die Eigenschaft wird nur gespeichert, wenn die Funktion IsColorStored True zurückliefert.
Die sieht so aus:
Zitat:

Zitat von VCL
function TControl.IsColorStored: Boolean;
begin
Result := not ParentColor;
end;

Wenn Du in Deiner Editklasse diese Methode so überschreibst
Delphi-Quellcode:
Result := Not(ParentColor) And Not(OnlyShow);
wird Color nur noch gespeichert, falls OnlyShow auf False steht (und ParentColor natürlich auch).

Für das Cursor-Property kannst Du Dir das analog basteln, dafür gibt es allerdings noch keine IsCursorStored Funktion, die musst Du komplett neu machen und auch die stored-Direktive in die Property-Deklarartion übernehmen.
Den Quelltext der VCl hast Du ja, ist alles in controls.pas.

Übrigens würde ich die Farbe nicht stur auf clBtnFace setzen sondern auf (Parent as TWinControl).Color, falls das Form mal eine andere Farbe hat.

Wie gesagt, da ganze ist nur eine Idee, habe es nicht probiert...

Gruß, teebee

Gruber_Hans_12345 23. Sep 2004 18:43

Re: Neue Komponente / Properties speichern ?
 
@teebee
Interessante Idee, aber wie kann ich eine private methode überschreiben ?

Ich will die Farbe nicht auf die Farbe des Forms setzen (könnte ja dann auch Parentcolor verwenden) sondern die Farbe wird aus einer andern Funktion berechnet ... wollte das Beispiel so einfach wie Möglich halten ...

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... ;-))

teebee 24. Sep 2004 11:20

Re: Neue Komponente / Properties speichern ?
 
Ok, Du hast natürlich recht. Hatte die inherited-Zugriffe in den Set/Get-Methoden übersehen :oops:

Gruß, teebee


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:00 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