Autor Beitrag
j0hnny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Sa 30.10.10 15:37 
Ich habe eine eigene Komponente geschrieben, die auf TEdit basiert.
Jetzt will ich die Eigenschaft Color erst auf eine bestimmte Farbe setzten und danach wieder zurück in den Ausgangszustand (also die Farbe, die in der Entwicklungsumgebung angegeben wurde).

Jetzt habe ich den Create constructor überschrieben und versucht die eingestellte Farbe auszulesen und als NormalColor zu speichern. Leider klappt das nicht wirklich, weil anscheinend die Eigenschaft Color erst nach dem Create gesetzt wird.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
constructor TEditCustom.Create(AOwner: TComponent);
begin

  ErrorColor:=clRed;
  NormalColor:=Color;
end;


Weiß jemand Hilfe? Grüße
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 30.10.10 15:50 
Die in der IDE eingestellten Werte werden automatisch erst nach dem Konstruktor gesetzt. Du kannst dort also Standardwerte setzen, die dann durch die eingestellten ersetzt werden, sofern vorhanden. Das gilt sowohl für die IDE selbst als auch zur Laufzeit.
j0hnny Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Sa 30.10.10 20:44 
Achso, das erklärt das Ganze. Aber wie kann ich denn nun die in der IDE eingestellten Werte auslesen? Ich würde halt gerne die Werte zwischenspeichern. Und das direkt nach dem Create oder so.

Grüße
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 30.10.10 20:48 
Die stehen doch dann in den echten Eigenschaften.

Es gibt AfterConstruction, das kannst du überschreiben glaube ich, da sollten die Werte gesetzt sein (habs nie benutzt, aber ich vermute es ist so).
j0hnny Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Sa 30.10.10 21:00 
Also ich will halt sowas in der Art wie:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
ColorTemp:=Color; //Color aus der IDE
...
Color:=ColorNeu; //Color Überschreiben
...
Color:=ColorTemp; //Color zurücksetzten


Das Ganze steht in verschiedenen Prozeduren.


Das mit dem AfterCreate werd ich mal testen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 30.10.10 21:09 
Das sieht irgendwie seltsam aus, bist du sicher, dass das nicht besser geht? :gruebel:

Und davon abgesehen: Wenn du ohnehin woanders erst die werte überschreibst, reicht es doch die da auch zu sichern, oder?
j0hnny Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Sa 30.10.10 22:26 
Das Problem ist, dass die Prozeduren verschiedene Events sind, die der Nutzer auslöst. Also ist die Reihenfolge der Aufrufe nicht bekannt. So ähnlich sieht es aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure OnExit;
begin
  if error then
    Color:=ColorError
  else
    Color:=ColorNormal;
end;

procedure OnChange;
begin
    Color:=ColorNormal;
end;


Das heißt, ich brauche irgendwo her ColorNormal, was der Einstellung im IDE entsprechen soll. Natürlich könnte ich so eine Abfrage machen "if Color<>ColorError then..." oder so. Aber irgendwie müsste das doch auch anders gehen oder?
j0hnny Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Sa 30.10.10 22:35 
Es funktioniert jetzt mittels

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure OnExit;
begin
  if Color<>ColorError then ColorNormal:=Color;
  if error then
    Color:=ColorError
  else
    Color:=ColorNormal;
end;

procedure OnChange;
begin
  if Color<>ColorError then ColorNormal:=Color;
  Color:=ColorNormal;
end;


Aber so sauber finde ich das nicht.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 30.10.10 22:43 
So, ich habe es ausprobiert, nach dem inherited im Konstruktor und wie von mir vermutet in AfterConstruction ist der eingestellte Wert gesetzt. :nixweiss:

Du hast in deinem ersten Quelltext schlicht das inherited vergessen. ;-)
j0hnny Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Sa 30.10.10 22:51 
Komisch. Das "Inherited" habe ich drin, nur im ersten Post vergessen.
Demnach müsste doch folgender Code funktionieren, oder?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
constructor TMeinEdit.Create(AOwner: TComponent);
begin
  Inherited;
  ColorError:=clRed;
  ColorNormal:=Color;
end;

procedure TMeinEdit.Change;
begin
  if error then
    Color:=ColorNormal
  else
    Color:=ColorError;
end;


Tut er aber nicht. In ColorNormal wird immer nur Weiß gespeichert, aber nicht die Farbe aus dem IDE. Was mach ich falsch?^^

PS: Mit
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TMeinEdit.AfterConstruction;
begin
  Inherited;
  ColorNormal:=Color;
end;

klappts auch nicht.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 30.10.10 23:05 
Ok, mein Fehler, ich installiere fast nie Komponenten, jetzt habe ich es mal gemacht. Getestet hatte ich das Formular selbst. Da läuft das natürlich anders. Bei einer Komponente werden die Werte ja nach deren Erzeugung vom Formular zugewiesen.

Ich habe aber eine ganz andere Idee: Benutze einfach den Setter von deiner Property Color. ;-)
Wenn du dann intern die Farbe setzt, darfst du dann natürlich nicht den auch benutzen (sondern z.b. inherited Color setzen).

Denn das Problem ist doch ansonsten, dass deine Komponente nicht mit späteren Zuweisungen an Color klarkommt. ;-)
j0hnny Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Sa 30.10.10 23:24 
Ich kenn mich halt garnicht mit Komponenten aus.

Wie meist du das mit dem Color setzen. Was genau muss ich tun? ;) Woher kriege ich denn die SetColor Funktion.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 30.10.10 23:33 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
  published
    property Color: TColor read GetColor write SetColor;
  end;

// ...

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

procedure TEditX.SetColor(const Value: TColor);
begin
  inherited Color := Value;
  FMyColor := Value;
end;
j0hnny Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Sa 30.10.10 23:51 
Also für ColorNormal "Color:=ColorNormal;" und für ColorError "inherited Color:=ColorError;" ?

Ich werd das mal morgen ausprobieren. Vielen Dank für die all die Hilfe :)
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: So 31.10.10 00:29 
Es gibt ein Event bei Komponenten, welches Dir Bescheid sagt, wann di Eigenschaften aus dem DFM file geladen wurde. Da kannst Du einfach die in der Designzeit angegebenen Werte auslesen, sichern und überschreiben. Einfach die Methode Loaded dazu überschrieben.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Type TMyComponent = class(TEdit)
     public
       procedure Loaded; override;
     end;

implementation

procedure TMyComponent.Loaded;
begin
  OldColor := Self.Color;
end;


Hab jetzt die Variablen nicht eingebaut, aber darum ging es ja nicht ;)

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 31.10.10 01:30 
Aber dann kann die Eigenschaft eben nicht mehr später gesetzt werden, da dann die Automatik nicht greift. Deshalb ist hier die eigene Property die sinnvollere Variante. ;-)
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: So 31.10.10 10:48 
@jaenicke
ich denke auch eine 2. Property macht mehr Sinn
aber wenn es in OnCreate zwischenspeichert und in Loaded hat er ja auch alle Infod die er in seinem Fall benötigt, oder?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 31.10.10 10:50 
Der Setter wird auch ausgelöst, wenn die Eigenschaft beim Laden gesetzt wird. (Geht ja auch gar nicht anders.)

Deshalb wird der Rest dann gar nicht mehr gebraucht.
j0hnny Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: So 31.10.10 13:27 
Vielen Dank Jungs! Jetzt klappts!

Jetzt muss ich euch aber leider mit noch einer Frage nerven. Ich will, dass die Eigenschaft ColorError im IDE unter den Objekt-Eigenschaften erscheint.
Dafür muss ich ja ne eigene Property definieren. Muss ich wirklich für jede Property eine Set-Prozedur und eine Get-Funktion schreiben und dann noch in OnCreate einen Standartwert setzten? Oder geht das auch einfacher? Sowas wie
ausblenden Delphi-Quelltext
1:
2:
published
    ColorError: TColor default clRed;

wäre perfekt ;)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 31.10.10 13:37 
Du musst dann unter private auch noch ein Feld deklarieren, in dem der Wert gespeichert wird.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
private
  FColorError: TColor;
published
  property ColorError: TColor read FColorError write FColorError;
Das wird aber auch automatisch gemacht, wenn du die Property eingibst und Strg + Shift + C drückst. ;-)
Das nennt sich Klassenvervollständigung.