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
Seite 2 von 4     12 34      
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#11

AW: Komponente: noch grün hinter den Ohren

  Alt 10. Feb 2011, 16:49
Schau Dir einmal SHIFT-CTRL-C an (allerdings abhängig von Deiner Delphi-Edition/Version).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
SvenLittkowski

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

AW: Komponente: noch grün hinter den Ohren

  Alt 10. Feb 2011, 17:48
Vielen Dank für alle bisherigen Antworten, Ihr alle habt mir wesentlich weitergeholfen. Hier der Code, wie er jetzt ist:

unit ColorMixer;

Code:
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;
      SetColor1_Original:       TColor;
      SetColor2_Added:          TColor;
      SetFMixStrengthPercentage: Byte;
    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.
Die Komponente läßt sich jetzt zwar kompilieren, aber es sind nach Einfügen auf einem Formular nur die zwei zu mischenden Farbfelder sichtbar sowie das Mischungsverhältnis, und auch bei versuchtem Ändern in andere Farben bleiben sie schwarz.

Was ich aber will, ist zu ereichen, daß die Farben geändert werden können, und das auch die resultierende Farbe sofort nach Setzen der zu mischenden Farben und des Farbverhältnisses im Objektinspektor angezeigt wird.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.068 Beiträge
 
Delphi 12 Athens
 
#13

AW: Komponente: noch grün hinter den Ohren

  Alt 10. Feb 2011, 18:02
FColor1_Original und SetColor1_Original sind zwei unterschiedliche Felder.

Wenn du auf ein Blatt was draufschreibst, dann steht das doch auch nicht automatisch auf einem anderem Blatt mit drauf, so daß man dort das Geschriebene wieder ablesen könnte.


Ich empfehle einfach mal irgendein Tutorial zum Aufbau von Klassen oder gar eines für die Komponentenentwicklung zu lesen und abzuarbeiten.


PS:
Getter = eine Funktion, welche einen Wert an ein Property weitergibt
Setter = eine Prozedur, welche den Wert von einem Property speicher
Felder = eine Variable in einer Klasse
Property = eine öffentliche Schnittstelle (virtuelles Feld), welche man auf Felder, Getter oder Setter umleitet.

PSS: wir haben auch eine [DELPHI]-Code-Tag (der Button mit dem Delphi-Helm)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (10. Feb 2011 um 18:04 Uhr)
  Mit Zitat antworten Zitat
SvenLittkowski

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

AW: Komponente: noch grün hinter den Ohren

  Alt 11. Feb 2011, 01:09
Ja, Kritik angenommen. Du hast sehr Recht, im Grudne genommen sollte ich erst mal etwas darüber lesen. Werde dies auch nachholen, da ich dies auch so sehe.

Danke für die Auflistung der Prozedur- oder Funktionsnamen. Ich werde sie gleich mal ausprobieren. Will die Komponente noch heute fertigstellen. Ich bin eher der Mensch, der Anhand praktischer Übungen lernt. Lesen tue ich auch gerne, aber das Verständnis kommt eher beim praktischen Experimentieren, auch das Interesse übrigens.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#15

AW: Komponente: noch grün hinter den Ohren

  Alt 11. Feb 2011, 01:50
wir haben auch eine [DELPHI]-Code-Tag (der Button mit dem Delphi-Helm)
Kennen wird er die, hat er auch schon einmal benutzt (sogar ganz bewusst, weil nachträglich editiert)
http://www.delphipraxis.net/1079734-post23.html
War aber wohl mehr ein Erlkönig
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
SvenLittkowski

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

AW: Komponente: noch grün hinter den Ohren

  Alt 11. Feb 2011, 05:17
Hier ist wieder einmal ein Update meines gegenwärtigen (widerwä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 default $00000000;
      property Color2_Added: TColor read FColor2_Added write SetColor2_Added default $00FFFFFF;
      property MixStrengthPercentage: Byte read FMixStrengthPercentage write SetMixStrengthPercentage default 50;
      property Color3_Result: TColor read FColor3_Result write SetColor3_Result default $00888888;
    end;

  procedure Register;

implementation

  constructor TColorMixer.Create(AOwner: TComponent);
  begin
   inherited Create(AOwner);
  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);
  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.
Die Komponente läßt sich kompilieren und in die Delphi-Komponentenleiste einfügen, nur ... bewirken tut sich halt noch nichts, ha ha ha!

Probleme:
- Komponente soll im Objektinspektor gleich beim Farbändern die "Color3_Result" aktualisieren.
- Alle drei Farben werden trotz eigener Default-Werte immer als clBlack angezeigt, der Mixwert immer als 0 (statt 50).
- Kann das (unnötige) Wählen einer Farbe für "Color3_Result" blockiert werden?
- Will ein eigenes Icon für meine Komponente in die Komponentenleiste von Delphi einbinden.

PS
Sir Rufo, jaaaa, jetzt habe ich's getan, ha ha ha!

Geändert von SvenLittkowski (11. Feb 2011 um 05:30 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
 
#17

AW: Komponente: noch grün hinter den Ohren

  Alt 11. Feb 2011, 08:29
- Komponente soll im Objektinspektor gleich beim Farbändern die "Color3_Result" aktualisieren.

>> einfach Colorize, wobei in Deinem Code die Resultfarbe gar nicht gesetzt wird, in den Settern aufrufen...oder besser den den Getter der ReultFarbe geich an Colorize hängen

- Alle drei Farben werden trotz eigener Default-Werte immer als clBlack angezeigt, der Mixwert immer als 0 (statt 50).
>>http://mc-computing.com/languages/De...roperties.html

- Kann das (unnötige) Wählen einer Farbe für "Color3_Result" blockiert werden?
>>den Setter entfernen

- Will ein eigenes Icon für meine Komponente in die Komponentenleiste von Delphi einbinden.
>> http://mc-computing.com/languages/delphi/Components.htm
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
Jumpy

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

AW: Komponente: noch grün hinter den Ohren

  Alt 11. Feb 2011, 08: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 08: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
 
#19

AW: Komponente: noch grün hinter den Ohren

  Alt 11. Feb 2011, 10: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
 
#20

AW: Komponente: noch grün hinter den Ohren

  Alt 11. Feb 2011, 17: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
Antwort Antwort
Seite 2 von 4     12 34      


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 04:46 Uhr.
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