Autor |
Beitrag |
j0hnny
      
Beiträge: 30
|
Verfasst: 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.
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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 30
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 30
|
Verfasst: Sa 30.10.10 21:00
Also ich will halt sowas in der Art wie:
Delphi-Quelltext 1: 2: 3: 4: 5:
| ColorTemp:=Color; ... Color:=ColorNeu; ... Color:=ColorTemp; |
Das Ganze steht in verschiedenen Prozeduren.
Das mit dem AfterCreate werd ich mal testen.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 30.10.10 21:09
Das sieht irgendwie seltsam aus, bist du sicher, dass das nicht besser geht?
Und davon abgesehen: Wenn du ohnehin woanders erst die werte überschreibst, reicht es doch die da auch zu sichern, oder?
|
|
j0hnny 
      
Beiträge: 30
|
Verfasst: 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:
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 
      
Beiträge: 30
|
Verfasst: Sa 30.10.10 22:35
Es funktioniert jetzt mittels
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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
Du hast in deinem ersten Quelltext schlicht das inherited vergessen. 
|
|
j0hnny 
      
Beiträge: 30
|
Verfasst: 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?
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
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TMeinEdit.AfterConstruction; begin Inherited; ColorNormal:=Color; end; |
klappts auch nicht.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 30
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 30.10.10 23:33
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 
      
Beiträge: 30
|
Verfasst: 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
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: 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.
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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 30
|
Verfasst: 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
Delphi-Quelltext 1: 2:
| published ColorError: TColor default clRed; |
wäre perfekt 
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 31.10.10 13:37
Du musst dann unter private auch noch ein Feld deklarieren, in dem der Wert gespeichert wird. 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.
|
|