AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Komponente: noch grün hinter den Ohren

Ein Thema von SvenLittkowski · begonnen am 10. Feb 2011 · letzter Beitrag vom 14. Feb 2011
Antwort Antwort
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#1

AW: Komponente: noch grün hinter den Ohren

  Alt 11. Feb 2011, 07:35
Du musst deine Setter anpassen, das mit ihnen auch Color 3 neu berechnet wird, was ja Colorize macht:

Delphi-Quellcode:
procedure TColorMixer.SetColor1_Original(Value: TColor);
  begin
   if Value<>FColor1_Original then
   begin
    FColor1_Original:=Value;
    FColor3_Result:=Colorize;
   end;
  end;
Der Setter für Color 3 macht keinen Sinn, da Color drei ja nicht gesetzt werden soll, sondern nur berechet, was ja jetzt die Setter machen, wenn du sie wie oben änderst. Also weg mit SetColor3_Result(Value: TColor) und natürlich die property entsprechend anpassen.


[Edit]
Bummi war schneller. Kann ich aber gleich selber eine Frage anschieben:

...oder besser den den Getter der ReultFarbe geich an Colorize hängen
Ich würde das so interpretieren, dass es das Feld/Attribut für Color3 gar nicht geben muss, sondern nur eine "read only property" Color3, die jeweils berechnet wird. Also nur das Ergebnis von Colorize zurückliefert. Ginge das auch? In einer normalen Klasse denk ich mal ja, aber auch bei etwas das im Objektinspektor angezeigt wird? Werden da Aktualisierungen einer der anderen Farben direkt weitergereicht?
Ralph

Geändert von Jumpy (11. Feb 2011 um 07:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Komponente: noch grün hinter den Ohren

  Alt 11. Feb 2011, 09:53
Zitat:
Ich würde das so interpretieren, dass es das Feld/Attribut für Color3 gar nicht geben muss, sondern nur eine "read only property" Color3, die jeweils berechnet wird. Also nur das Ergebnis von Colorize zurückliefert. Ginge das auch?
Ja geht und so hatte ich aus gemeint...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
SvenLittkowski

Registriert seit: 18. Dez 2004
98 Beiträge
 
#3

AW: Komponente: noch grün hinter den Ohren

  Alt 11. Feb 2011, 16:51
Vielen Dank für die Links. Ich hatte mir die Links
- http://mc-computing.com/languages/delphi/Components.htm
- http://mc-computing.com/languages/delphi/Resources.html
durchgelesen und versucht, in meiner Unit umzusetzen.

Hier erstmal ein Update des gegenwärtigen Codes:

Delphi-Quellcode:
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;
    protected
      procedure SetColor1_Original(Value: TColor);
      procedure SetColor2_Added(Value: TColor);
      procedure SetMixStrengthPercentage(Value: Byte);
      procedure SetColor3_Result(Value: TColor);
      function Colorize: TColor;
    public
      constructor Create( AOwner: TComponent); override;
    published
      property Color1_Original: TColor read FColor1_Original write SetColor1_Original stored true default $00000000;
      property Color2_Added: TColor read FColor2_Added write SetColor2_Added stored true default $00FFFFFF;
      property MixStrengthPercentage: Byte read FMixStrengthPercentage write SetMixStrengthPercentage stored true default 50;
      property Color3_Result: TColor read FColor3_Result default $00888888;
    end;

  procedure Register;

//{$R ColorMixer.res}
{$R ColorMixer.dcr}

implementation

  constructor TColorMixer.Create(AOwner: TComponent);
  var Filename, s: String;
  begin
   inherited Create(AOwner);
   Color1_Original:=$00000000;
   Color2_Added:=$00FFFFFF;
   MixStrengthPercentage:=50;
// Color3_Result:=$00888888;

   if not (csDesigning in ComponentState) then
   begin
    if (Filename='')or(Filename='.') then
    begin
     s:=Application.ExeName;
     Filename:=ChangeFileExt(s,'.ini');
    end;
   end;
  end;

  procedure TColorMixer.SetColor1_Original(Value: TColor);
  begin
   if Value<>FColor1_Original then
   begin
    FColor1_Original:=Value;
    Colorize;
   end;
  end;

  procedure TColorMixer.SetColor2_Added(Value: TColor);
  begin
   if Value<>FColor2_Added then
   begin
    FColor2_Added:=Value;
    Colorize;
   end;
  end;

  procedure TColorMixer.SetMixStrengthPercentage(Value: Byte);
  begin
   if Value<>FMixStrengthPercentage then
   begin
    FMixStrengthPercentage:=Value;
    Colorize;
   end;
  end;

  procedure TColorMixer.SetColor3_Result(Value: TColor);
  begin
   if Value<>FColor3_Result then
   begin
    FColor3_Result:=Colorize;
   end;
  end;

  function TColorMixer.Colorize: TColor;
  var
   Color1, Color2: LongInt;
   ValueR, ValueG, ValueB, Value1, Value2: Byte;
  begin
   MixStrengthPercentage:=Round(2.55*MixStrengthPercentage);
   Color1:=ColorToRGB(Color1_Original);
   Color2:=ColorToRGB(Color2_Added);
   Value1:=Byte(Color1);
   Value2:=Byte(Color2);
   ValueR:=MixStrengthPercentage*(Value1-Value2) shr 8+Value2;
   Value1:=Byte(Color1 shr 8);
   Value2:=Byte(Color2 shr 8);
   ValueG:=MixStrengthPercentage*(Value1-Value2) shr 8+Value2;
   Value1:=Byte(Color1 shr 16);
   Value2:=Byte(Color2 shr 16);
   ValueB:=MixStrengthPercentage*(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.
Ich hatte mit dem Image Editor eine Resource hergestellt, zuerst ein Icon, als dieses trotzdem kein Komponentenbild bei der Neukompilierung ergab, dann ein BMP. Nach wie vor kein schönes Bildchen bei Neukompilierung, dafür aber ein unterhaltender STACK OVERFLOW, wenn ich die Komponente auf ein Formular bringe, und das vorzeitige Schließen von Delphi, whuuaaa haa ha ha ha! Der wahnwitzig-tolldreiste Wahn breitet sich nun langsam in mir aus...

Es scheint aber nicht an der eingebundenen Resource zu liegen. Ich hatte wahlweise die eine und dann die andere Resource aus dem Code entfernt und auch aus Delphi's Library.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Komponente: noch grün hinter den Ohren

  Alt 11. Feb 2011, 18:32
nicht über die Setter initialisiseren, sondern so:
Delphi-Quellcode:
  constructor TColorMixer.Create(AOwner: TComponent);
  var Filename, s: String;
  begin
   inherited Create(AOwner);
   FColor1_Original:=$00000000;
   FColor2_Added:=$00FFFFFF;
   FMixStrengthPercentage:=50;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
SvenLittkowski

Registriert seit: 18. Dez 2004
98 Beiträge
 
#5

AW: Komponente: noch grün hinter den Ohren

  Alt 11. Feb 2011, 19:00
Vielen Dank, Thomas. Ich habe nun diese Stelle des Codes so modifiziert:

Delphi-Quellcode:
...
    published
      property Color1_Original: TColor read FColor1_Original write SetColor1_Original stored true default $00000000;
      property Color2_Added: TColor read FColor2_Added write SetColor2_Added stored true default $00FFFFFF;
      property MixStrengthPercentage: Byte read FMixStrengthPercentage write SetMixStrengthPercentage stored true default 50;
      property Color3_Result: TColor read FColor3_Result default $00888888;
    end;

  procedure Register;

//{$R ColorMixer.res}
//{$R ColorMixer.dcr}

implementation

  constructor TColorMixer.Create(AOwner: TComponent);
  var Filename, s: String;
  begin
   inherited Create(AOwner);
   FColor1_Original:=$00000000;
   FColor2_Added:=$00FFFFFF;
   FMixStrengthPercentage:=50;
// Color3_Result:=$00888888;

   if not (csDesigning in ComponentState) then
   begin
    if (Filename='')or(Filename='.') then
    begin
     s:=Application.ExeName;
     Filename:=ChangeFileExt(s,'.ini');
    end;
   end;
  end;

Nun gibt es zumindest keinen vorzeitigen Abbruch von Delphi wegen STACK OVERFLOW, wenn ich die Komponente auf das Formular ziehe. Aber irgendwo steckt noch immer ein Fehler, denn nun bekomme ich Besuch vom STACK OVERFLOW, sobald ich eine Farbe im Objekt Inspektor verändere. Ich meine, daß dies wahrscheinlich irgendwo bei den PUBLISHED Feldern liegt, muß ich dort auch noch etwas ändern?

Sobald ich diese Komponente zum Laufen gebracht habe, werde ich andere Komponenten viel besser entwickeln können, ohne all meine vielen Fragen.

Vielen Dank an Euch alle für all die Zeit und Mühe. Ich schätze Eure Unterstützung sehr.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: Komponente: noch grün hinter den Ohren

  Alt 11. Feb 2011, 19:06
tja, jetzt knallt es unter anderem da
Delphi-Quellcode:
  
function TColorMixer.Colorize: TColor;
  var
   Color1, Color2: LongInt;
   ValueR, ValueG, ValueB, Value1, Value2: Byte;
  begin
   MixStrengthPercentage:=
Du ruft den Setter von FMixStrengthPercentage auf und der dann wieder...Colorize

Delphi-Quellcode:
  procedure TColorMixer.SetMixStrengthPercentage(Value: Byte);
  begin
   if Value<>FMixStrengthPercentage then
   begin
    FMixStrengthPercentage:=Value;
    Colorize;
   end;
  end;
usw....

IMHO solltest Du alle Aufrufe von Colorize bis auf den Getter rausschmeißen und die Werte nicht über die Setter setzen, außer diese tun mehr als den Wert zu setzen (wobei Rekursionen zu vermeiden sind >> Stackoverflow)
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
SvenLittkowski

Registriert seit: 18. Dez 2004
98 Beiträge
 
#7

AW: Komponente: noch grün hinter den Ohren

  Alt 13. Feb 2011, 01:29
Vielen Dank erneut.

So sieht der Code zur Zeit aus:

Delphi-Quellcode:
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;
    protected
      procedure SetColor1_Original(Value: TColor);
      procedure SetColor2_Added(Value: TColor);
      procedure SetMixStrengthPercentage(Value: Byte);
      procedure SetColor3_Result(Value: TColor);
      function Colorize: TColor;
    public
      constructor Create( AOwner: TComponent); override;
    published
      property Color1_Original: TColor read FColor1_Original write SetColor1_Original stored true default $00000000;
      property Color2_Added: TColor read FColor2_Added write SetColor2_Added stored true default $00FFFFFF;
      property MixStrengthPercentage: Byte read FMixStrengthPercentage write SetMixStrengthPercentage stored true default 50;
      property Color3_Result: TColor read FColor3_Result default $00888888;
    end;

  procedure Register;

//{$R ColorMixer.res}
//{$R ColorMixer.dcr}

implementation

  constructor TColorMixer.Create(AOwner: TComponent);
  var Filename, s: String;
  begin
   inherited Create(AOwner);
   FColor1_Original:=$00000000;
   FColor2_Added:=$00FFFFFF;
   FMixStrengthPercentage:=50;

   if not (csDesigning in ComponentState) then
   begin
    if (Filename='')or(Filename='.') then
    begin
     s:=Application.ExeName;
     Filename:=ChangeFileExt(s,'.ini');
    end;
   end;
  end;

  procedure TColorMixer.SetColor1_Original(Value: TColor);
  begin
   if Value<>FColor1_Original then
   begin
    FColor1_Original:=Value;
   end;
  end;

  procedure TColorMixer.SetColor2_Added(Value: TColor);
  begin
   if Value<>FColor2_Added then
   begin
    FColor2_Added:=Value;
   end;
  end;

  procedure TColorMixer.SetMixStrengthPercentage(Value: Byte);
  begin
   if Value<>FMixStrengthPercentage then
   begin
    FMixStrengthPercentage:=Value;
   end;
  end;

  procedure TColorMixer.SetColor3_Result(Value: TColor);
  var
   Color1, Color2: LongInt;
   ValueR, ValueG, ValueB, Value1, Value2: Byte;
  begin
   if Value<>FColor3_Result then
   begin
    FColor3_Result:=Colorize;
   end;
  end;

  function TColorMixer.Colorize: TColor;
  var
   Color1, Color2: LongInt;
   ValueR, ValueG, ValueB, Value1, Value2: Byte;
  begin
   FMixStrengthPercentage:=Round(2.55*FMixStrengthPercentage);
   Color1:=ColorToRGB(FColor1_Original);
   Color2:=ColorToRGB(FColor2_Added);
   Value1:=Byte(Color1);
   Value2:=Byte(Color2);
   ValueR:=FMixStrengthPercentage*(Value1-Value2) shr 8+Value2;
   Value1:=Byte(Color1 shr 8);
   Value2:=Byte(Color2 shr 8);
   ValueG:=FMixStrengthPercentage*(Value1-Value2) shr 8+Value2;
   Value1:=Byte(Color1 shr 16);
   Value2:=Byte(Color2 shr 16);
   ValueB:=FMixStrengthPercentage*(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.
Die Zeiten des STACK OVERFLOWs sind nun vorbei, allerdings haben die Zeiten des reibungslosen und ordnungsgemäßen Funktionierens auch noch nicht angefangen...

Ich habe mir meine Gedanken gemacht, warum ich - trotz gelesener Tutorials (siehe Links einige Postings zuvor) und guten Hinweisen zu Teilproblemen - ich nicht weiterkomme. Ich will Euch alle ja auch nicht immer mit meinen Fragen nerven. Ist halt meine allerserte Komponente. Vieleicht würde es mir weiterhelfen, den Code einer einigermaßen vergleichbaren Komponente mir mal durchzulesen. Also von einer Komponente, wo Eingaben gemacht werden, und dadurch ein Ergebnis entsteht. Kennt jemand so eine Komponente? Wenn ich mir deren Quellcode durchlese, würde ich bestimmt dies auch auf meine Komponente anwenden können, hoffe ich. Meine Befürchtung ist, daß man hier denken könnte, ich will es mir einfach machen. Und ich bin der Menschentyp, der gut von funktionierenden Vorbildern lernen kann.

Ich suche also eine Beispielskomüponente, die
- nicht zu umfangreich ist
- Eingaben vom benutzer erwartet
- ein davon abhängiges Resultat in einem der Felder liefert.

Meine Komponente gibt zur Zeit immer nur ein schwarz zurück...
Und auch das Bild für die Komponentenleiste will nicht kommen, deshalb habe ich beide Resourcen erstmal ungültig gemacht (zwei, weil weder das Bitmap noch danach das Icon angezeigt wurden und ich unsicher war). Hatte beide Resourcen (ein Icon und ein Bitmap) im Image Editor als jeweils Resource erstellt.

Geändert von SvenLittkowski (13. Feb 2011 um 01:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#8

AW: Komponente: noch grün hinter den Ohren

  Alt 13. Feb 2011, 09:20
Also zuerst mal, ich finde Du maschst das im Vergleich zu vielen Newbies sehr gut, zu anderen hast Du nur einen kleinen Fehler drin.
      property Color3_Result: TColor read Colorize; um Beispiele zu sehen brauchst Du eigentlich nur bei einer Komponente Deiner Wahl mit STRG auf den Klssennamen klicken und den Code einzusehen.
Bei Klick auf TButton landest Du bei
TButton = class(TCustomButton)
bei Klick auf
TCustomButton dann bei
TCustomButton = class(TButtonControl)
und so weiter...
STRG+Shift + Pfeil ab und Du bist in der Implementierung...
STRG+Shift + Pfeil auf und Du bist wieder in der Deklaration.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:30 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