![]() |
Komponente: noch grün hinter den Ohren
Hi. Ich habe so gut wie keine Erfahrung damit, Komponenten für Delphi zu erstellen, trotzdem will ich mir eine erste Komponente erstellen, die ich einfach immer wieder brauchen werde. War klar, daß ich einige Fehler machen würde. Und hier sind sie, die Fehler und der Code:
Code:
01.unit ColorMixer;
02. 03.interface 04. 05. uses 06. SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, 07. Forms, Dialogs, StdCtrls; 08. 09. type 10. TColorMixer=class(TObject) 11. private 12. FColor1_Original: TColor; 13. FColor2_Added: TColor; 14. FMixStrengthPercentage: Byte; 15. FColor3_Result: TColor; 16. protected 17. function Colorize(Sender: TObject; ColorOriginal, ColorAdded: TColor; PercentageStrength: Byte): TColor; 18. public 19. constructor Create( AOwner: TComponent ); override; 20. property Color1_Original: TColor read FColor1_Original default clBlack; 21. property Color2_Added: TColor read FColor2_Added default clWhite; 22. property MixStrengthPercentage: Byte read FMixStrengthPercentage; 23. published 24. property Color3_Result: TColor read FColor3_Result 25. write SetColor3_Result 26. default clGray; 27. end; 28. 29. procedure Register; 30. 31.implementation 32. 33. constructor TColorMixer.Create(AOwner: TComponent); 34. begin 35. inherited Create(AOwner); 36. end; 37. 38. function TAlpha.Colorize(Sender: TObject; ColorOriginal, ColorAdded: TColor; PercentageStrength: Byte): TColor; 39. var 40. Color1, Color2: LongInt; 41. ValueR, ValueG, ValueB, Value1, Value2: Byte; 42. begin 43. PercentageStrength:=Round(2.55*PercentageStrength); 44. Color1:=ColorToRGB(ColorOriginal); 45. Color2:=ColorToRGB(ColorAdded); 46. Value1:=Byte(Color1); 47. Value2:=Byte(Color2); 48. ValueR:=PercentageStrength*(Value1-Value2) shr 8+Value2; 49. Value1:=Byte(Color1 shr 8); 50. Value2:=Byte(Color2 shr 8); 51. ValueG:=PercentageStrength*(Value1-Value2) shr 8+Value2; 52. Value1:=Byte(Color1 shr 16); 53. Value2:=Byte(Color2 shr 16); 54. ValueB:=PercentageStrength*(Value1-Value2) shr 8+Value2; 55. Result:=(ValueB shl 16)+(ValueG shl 8)+ValueR; 56. end; 57. 58. procedure Register; 59. begin 60. RegisterComponents('Sven Littkowski`s Best',[TColorMixer]); // Eher "Sven Littkowski's Worst"... 61. end; 62. 63.end. Zitat:
|
AW: Komponente: noch grün hinter den Ohren
Mit diesen Hinweisen müsstest du eigentlich auch ohne Sourcecode etwas anfangen können:
[Zeile 10] Komponenten müssen entweder direkt von TComponent oder von einer Nachfahrklasse von TComponent abgeleitet werden. [Zeile 25] Wenn man auf eine Property über eine Setter-Methode zugreifen will, dann muss man diese natürlich auch deklarieren und implementieren. [Zeile 38] Der Name deiner Klasse ist nicht TAlpha, sondern TColorMixer. |
AW: Komponente: noch grün hinter den Ohren
Ja, guter Hinweis. Einerseits bin ich absolut unerfahren mit dem Herstellen von Komponenten, abdererseits (TAlpha) habe ich Elemente aus einem Programm kopiert und war sehr schludrig mit dem korrekten Implementieren.
Einige Fragen habe ich aber noch: 1. Ich will eigentlich erreichen, daß im Object Inspector alle drei Farbfelder und daß prozentuale Mischverhältnis sichtbar sind, davon bis auf Color3 auch alle vom Benutzer manipulierbar. Was muß ich dazu tun? Wie gesagt, ich fange bei 0 an bei den Komponenten... :-( 2. Außerdem würde ich gerne ein Farbergebnis in RealTime haben. Ich ahne, daß ich die Klasse TTimer einfügen muß, liege ich darin richtig? Aber wie bringe ich den Timer dazu, ständig zu laufen? Und wie baue ich überhaupt dieses Dingelchen ein? 3. Und ich würde gerne das Default-Icon in der Komponentenleiste von Delphi durch ein eigenes Icon ersetzen, auch hier totales Neuland. |
AW: Komponente: noch grün hinter den Ohren
Farbe 1,2 und Percentage mit Getter und Setter versehen, Farbe 3 nur mit Getter.
Timer benötigst Du keinen. |
AW: Komponente: noch grün hinter den Ohren
Und in den Settern baust du dann jeweils noch die Aktualisierung von Farbe 3 ein, das sollte glaub ich das sein, was du mit Realtime meinst?
|
AW: Komponente: noch grün hinter den Ohren
"Color3" als Getter = "FColor3"?
|
AW: Komponente: noch grün hinter den Ohren
Delphi-Quellcode:
Die Property sind nur im Objektinspektor sichtbar, wenn diese auch published sind.
property Color1_Original: TColor read FColor1_Original default clBlack;
21. property Color2_Added: TColor read FColor2_Added default clWhite; 22. property MixStrengthPercentage: Byte read FMixStrengthPercentage; Der Setter fehlt natürlich auch. |
AW: Komponente: noch grün hinter den Ohren
Hier der inzwischen veränderte Code.
Code:
unit ColorMixer;
interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TColorMixer=class(TComponent) private FColor1_Original: TColor; FColor2_Added: TColor; FMixStrengthPercentage: Byte; FColor3_Result: TColor; SetColor3_Result: TColor; protected function Colorize(Sender: TObject; ColorOriginal, ColorAdded: TColor; PercentageStrength: Byte): TColor; public constructor Create( AOwner: TComponent); override; published property Color1_Original: TColor read FColor1_Original write SetColor1_Original default clBlack; property Color2_Added: TColor read FColor2_Added write SetColor2_Added default clWhite; property MixStrengthPercentage: Byte read FMixStrengthPercentage write SetFMixStrengthPercentage default 50; property Color3_Result: TColor read FColor3_Result default clGray ; end; procedure Register; implementation constructor TColorMixer.Create(AOwner: TComponent); begin inherited Create(AOwner); end; function TColorMixer.Colorize(Sender: TObject; ColorOriginal, ColorAdded: TColor; PercentageStrength: Byte): TColor; var Color1, Color2: LongInt; ValueR, ValueG, ValueB, Value1, Value2: Byte; begin PercentageStrength:=Round(2.55*PercentageStrength); Color1:=ColorToRGB(ColorOriginal); Color2:=ColorToRGB(ColorAdded); Value1:=Byte(Color1); Value2:=Byte(Color2); ValueR:=PercentageStrength*(Value1-Value2) shr 8+Value2; Value1:=Byte(Color1 shr 8); Value2:=Byte(Color2 shr 8); ValueG:=PercentageStrength*(Value1-Value2) shr 8+Value2; Value1:=Byte(Color1 shr 16); Value2:=Byte(Color2 shr 16); ValueB:=PercentageStrength*(Value1-Value2) shr 8+Value2; Result:=(ValueB shl 16)+(ValueG shl 8)+ValueR; end; procedure Register; begin RegisterComponents('Sven Littkowski`s Best',[TColorMixer]); end; end. Zitat:
|
AW: Komponente: noch grün hinter den Ohren
property Color1_Original: TColor read FColor1_Original write SetColor1_Original default clBlack;
property Color2_Added: TColor read FColor2_Added write SetColor2_Added default clWhite; property MixStrengthPercentage: Byte read FMixStrengthPercentage write SetFMixStrengthPercentage default 50; :wink: Gruß K-H |
AW: Komponente: noch grün hinter den Ohren
22 bis 24: Wenn du schon eine Settermethode angeben willst, dann solltest du diese auch implementieren.
"Field or method identifier expected" = "Feld/Variable oder Methode/Prozedur erwartet" ... bei dir wurde aber was Unbekanntes/Nichtdeklariertes (nicht) gefunden 16: Dieses Feld wurde deklariert, aber du hast es nirgendwo verwendet. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz