Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Komponente: noch grün hinter den Ohren (https://www.delphipraxis.net/158233-komponente-noch-gruen-hinter-den-ohren.html)

SvenLittkowski 10. Feb 2011 01:05

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:

Zitat von Mein Delphi 7
[Error] ColorMixer.pas(19): Cannot override a static method
[Error] ColorMixer.pas(26): Field or method identifier expected
[Error] ColorMixer.pas(35): Too many actual parameters
[Error] ColorMixer.pas(38): Function needs result type
[Error] ColorMixer.pas(43): Undeclared identifier: 'PercentageStrength'
[Error] ColorMixer.pas(44): Undeclared identifier: 'ColorOriginal'
[Error] ColorMixer.pas(45): Undeclared identifier: 'ColorAdded'
[Error] ColorMixer.pas(60): Incompatible types: 'TComponentClass' and 'Class reference'
[Error] ColorMixer.pas(17): Unsatisfied forward or external declaration: 'TColorMixer.Colorize'
[Fatal Error] dclusr.dpk(176): Could not compile used unit '..\Projects\Sven\Unit ColorMixer\ColorMixer.pas'

Der Quellcode ist sehr kurz, da die Komponente nur eine sehr grundlegende Funktion erfüllt. Trotzdem die vielen Fehler. Bitte setzt nicht voraus, daß mir Hinweise in den meisten Fällen helfen werden, da dies ein Neuland für mich ist. Ich denke da eher an Korrekturen. Na, mal sehen. Jedenfalls vielen Dank für's Lesen und Zeitnehmen, und auch für Eure guten Absichten!

FaTaLGuiLLoTiNe 10. Feb 2011 04:28

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.

SvenLittkowski 10. Feb 2011 06:11

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.

Bummi 10. Feb 2011 07:45

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.

Jumpy 10. Feb 2011 07:49

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?

SvenLittkowski 10. Feb 2011 07:58

AW: Komponente: noch grün hinter den Ohren
 
"Color3" als Getter = "FColor3"?

Blup 10. Feb 2011 08:37

AW: Komponente: noch grün hinter den Ohren
 
Delphi-Quellcode:
     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;
Die Property sind nur im Objektinspektor sichtbar, wenn diese auch published sind.
Der Setter fehlt natürlich auch.

SvenLittkowski 10. Feb 2011 14:49

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:

Zitat von MyDelphi 7
[Error] ColorMixer.pas(22): Field or method identifier expected
[Error] ColorMixer.pas(23): Field or method identifier expected
[Error] ColorMixer.pas(24): Field or method identifier expected
[Hint] ColorMixer.pas(16): Private symbol 'SetColor3_Result' declared but never used
[Fatal Error] dclusr.dpk(176): Could not compile used unit '..\Projects\Sven\Unit ColorMixer\ColorMixer.pas'


p80286 10. Feb 2011 15:01

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

himitsu 10. Feb 2011 15:04

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 09:52 Uhr.
Seite 1 von 4  1 23     Letzte »    

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