Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Warum werden meine Farbwerte nich übernommen? (https://www.delphipraxis.net/54257-warum-werden-meine-farbwerte-nich-uebernommen.html)

schöni 30. Sep 2005 18:26


Warum werden meine Farbwerte nich übernommen?
 
Hallo!

Da will ich endlich mal ein glitze kleines Progrämmchen für die Allgemeinheit zugänglich machen und da tritt ein eklatenter Fehler auf. Das Programm soll Farbwerte übernehmen, die mit Trackbars eingestellt werden. Die sich ergebende Farbe soll in einer TShape Komponente angezeigt werden. Im fertigen Programm will ich auf diese Weise Farbpaletten erzeugen, die ich dann in einer Datei speichern will, um sie für die Farbgestaltung zukünftiger Anwendungen einzusetzen. Hier ist der Quelltext:

Delphi-Quellcode:
unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, ToolWin, StdCtrls, ExtCtrls;

type
  TRGBstructure = record
    case integer of
     0: (r,g,b: byte);
     1: (red,green,blue,alpha: byte);  //Die RGB Werte
     2: (color: Longint);              //Die Mischfarbe
  end;

type
  TRGBClass = class                             //Eine Klasse zur Bearbeitung der Farbwerte
  private
    rgbStruc: TRGBStructure;
    function getColor: Longint;
    procedure setColor(value: Longint);
    function getred: byte;
    procedure setred(value: byte);
    function getgreen: byte;
    procedure setgreen(value: byte);
    function getblue: byte;
    procedure setblue(value: byte);
  public
    constructor create(filename: string);
    destructor destroy; override;
    procedure LoadFromFile(filename: string);
    procedure SaveToFile(filename: string);
    property Color: Longint read getColor write setColor;
    property red: byte read getred write setred;
    property green: byte read getgreen write setgreen;
    property blue: byte read getblue write setblue;
  end;

type
  TForm1 = class(TForm)
    RedValue: TTrackBar;
    GreenVal: TTrackBar;
    BlueVal: TTrackBar;
    ColorMonitor: TShape;
    stxtRed: TStaticText;
    stGreen: TStaticText;
    stBlue: TStaticText;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    strMin: TStaticText;
    strMax: TStaticText;
    stgMin: TStaticText;
    stgMax: TStaticText;
    stbMin: TStaticText;
    stbMax: TStaticText;
    CoolBar1: TCoolBar;
    ToolBar1: TToolBar;
    procedure RedValueChange(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure GreenValChange(Sender: TObject);
    procedure BlueValChange(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Palette: TRGBClass;

implementation

{$R *.DFM}

function TRGBClass.getColor: Longint;
begin
   Result := rgbStruc.Color;
end;

procedure TRGBClass.setColor(value: Longint);
begin
   if rgbStruc.Color <> value then value := rgbStruc.Color;
end;

function TRGBClass.getred: byte;
begin
   Result := rgbStruc.red
end;

procedure TRGBClass.setred(value: byte);
begin
   if value <> rgbStruc.red then rgbStruc.red := value
end;

function TRGBClass.getgreen: byte;
begin
   Result := rgbStruc.green
end;

procedure TRGBClass.setgreen(value: byte);
begin
   if value <> rgbStruc.green then rgbStruc.green := value
end;

function TRGBClass.getblue: byte;
begin
   Result := rgbStruc.blue;
end;

procedure TRGBClass.setblue(value: byte);
begin
   if value <> rgbStruc.blue then rgbStruc.blue := value
end;


constructor TRGBClass.create(filename: string);
begin
   inherited Create;
end;

destructor TRGBClass.destroy;
begin
   inherited Destroy;
end;

procedure TRGBClass.LoadFromFile(filename: string);
begin
  //noch nicht implementiert
end;

procedure TRGBClass.SaveToFile(filename: string);
begin
  //noch nicht implementiert
end;

procedure TForm1.RedValueChange(Sender: TObject);
begin
   Palette.red := RedValue.Position; //Farbwert einstellen
   Brush.Color := Palette.Color;     //Gesamtfarbe übergeben
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   Palette := TRGBClass.Create('');
   ColorMonitor.Brush.Style := bsSolid;
   ColorMonitor.Brush.Color := Palette.Color;
end;

procedure TForm1.GreenValChange(Sender: TObject);
begin
   Palette.green := GreenVal.Position;
   ColorMonitor.Brush.Color := Palette.Color;
end;

procedure TForm1.BlueValChange(Sender: TObject);
begin
   Palette.blue := BlueVal.Position;
   ColorMonitor.Brush.Color := Palette.Color;
end;

end.
Nach Programmstart werden die Farben jedoch nicht korrekt übernommen und angezeigt. Kann mir jemand helfen. Wo liegt mein Fehler?

Verzweifelte Grüße von

schöni

himitsu 30. Sep 2005 18:40

Re: Warum werden meine Farbwerte nich übernommen?
 
ich kann zwar den sinn nicht so ganz erkennen, warum man dafür überhaupt 'ne Klasse braucht (die verbraucht ja mehr resourcen, als nötig -.-)


überprüfe, ob den Trackbars die Ereignisroutinen zuzuwiesen sind?

Brush.Color ... woltest du nicht ColorMonitor.Brush.Color verwenden?
(ok, durch diesen Fehler wird zwar nicht das Shape gefährbt ... sonder der Form-Hintergrund)


und dann noch zu weiteren Problemen:

* Palette wird nicht wieder freigegen

* Palette wird nicht "ordentlich" initialisiert
> rgbStruc auf 'nen definierten wert setzen (z.B. clBlack)
wobei da auch der fehler liegen könnte (da alpha, was ja bei der übergabe)

...

schöni 30. Sep 2005 19:46

Re: Warum werden meine Farbwerte nich übernommen?
 
Hallo himitsu!

Danke erst mal für die schnelle Antwort. Echt Klasse!

Den Trackbars sind die EventHandler zugewiesen, Daran liegt es nicht.

Zitat:

Brush.Color ... woltest du nicht ColorMonitor.Brush.Color verwenden?
Ist korrigiert. Danke! Vier Augen sehen eben doch mehr als nur zwei!

Die Palette ist jetzt auch initialisiert und wird mit OnClose meiner
Form jetzt auch ordentlich freigegeben. Danke auch für den Tipp!

Trotzdem trat der Fehler noch auf. Da hab ich noch mal den Objektinspektor genau angeguckt. Und da fiel mir auf, daß der Wert für TrackBar.Max auf dem Wert 10 stand (standardmäßig durch Delphi) Ich brauche aber den Wert 255, den maximalen Farbwert halt.

Damit ist die Ursache gefunden. Der Maximalwert meiner TrackBars war zu klein eingestellt!

Zitat:

ich kann zwar den sinn nicht so ganz erkennen, warum man dafür überhaupt 'ne Klasse braucht...
Danke für die Anregung. Werd das prüfen, wenn das Prog insgesamt fertig ist. Habe die Klasse gewählt, um die Einzelteile für das Programm als übersichtliche Bausteine zu haben.

Also, nochmal Danke für die Hilfe.


schöni


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:00 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