Solved

Paletteindex() relates to RGB() as...

Posted on 1997-09-14
11
501 Views
Last Modified: 2010-04-04

My question is: can some give the code for a procedure
BLA (Paletteindex: word; var Red,Green,Blue: word/integer?)

such that Shape1 will give the same color as Shape2

Shape1.Brush.Color:=paletteindex(x);

yields the same as

BLA(PaletteIndex(x), Red,GReen,Blue);
Shape2.Brush.Color:=RGB(Red,Green,Blue);
0
Comment
Question by:yonasb
  • 7
  • 4
11 Comments
 
LVL 3

Expert Comment

by:mirek071497
Comment Utility
You'r have problem because each control can have different palette and when you type
Shape1.Brush.Color := paletteindex(n) then you specify number in logical palette but when you type
Shape1.Brush.Color := RGB( ....) then windows calculate which entry of this paleete need to use.

I don't fully understand your question. Do you need read RGB values for PaletteEntry which have Index=n ?
If this is true you need to use GetPaletteEntries which retrive palette RGB values.
0
 

Author Comment

by:yonasb
Comment Utility
To Mirek:

I know :
UINT GetPaletteEntries(
    HPALETTE  hpal,UINT  iStartIndex,      
    UINT  nEntries,    LPPALETTEENTRY  lppe );

-> But I do not understand how to use it.

I want the code for the following procedure.

Procedure GetRGBFromCurrentPalette
        (index: integer;
         var Red,Green,Blue: integer);
begin
??? <-can someone write this
end.

Example:

Shape1.Brush.Color:=PaletteIndex(12);

GetRGBFromCurrentPalette(12,Red,Green,Blue);

Shape2.Brush.Color:=RGB(Red,Green,Blue).

Shape1 en Shape2 must give the same color ON THE SCREEN.


Can you or someone else please write this little procedure for me?

Thanks
Yonas
0
 
LVL 3

Expert Comment

by:mirek071497
Comment Utility
Retrive RGB for palette - no problem, but you don't know palette  for tshape ! I think so you try make pogram with wrong way. Tell me what you are doing and i try help you more.

procedure GetRGBFromPalette( Hpal : HPalette; index : integer; var R,G,B : integer );
var lppe : TPaletteEntry;
begin
  if HPal<>0 then
  begin
    GetPaletteEntries ( HPal, index, 1, lppe );
    r:= lppe.peRed;
    g:= lppe.peGreen;
    b:= lppe.peBlue;
  end
  else
    ShowMessage( 'no palette' );
end;

p.s. When you Set color from PaletteIndex then you can't retrive values for R,G,B without Handle to palette.  VCL playing with this handle but you can't get acces to  this handle. This is because TShape is only for simple shape if you need more you need use own component as descendant of TGraphicControl.
0
 
LVL 3

Expert Comment

by:mirek071497
Comment Utility
Do you understand my comment?
Do you need more help ?
0
 

Author Comment

by:yonasb
Comment Utility
Mirek,

I don't understand. I need more help.

Do you mean this: ?????

I can set  Shape1.Brush.Color := $01000001
When I do, the color of Shape1.Brush.Color becomes
palette color 1 in Windows palette (if that is the
current palette).
You say: I cannot get the RGB value because I don't have
a handle to the palette.
?????????


How can I read the color of Shape1.Brush??

I must be able to use $010000xx because I want to read
the current palette color of Windows. In my program some
shapes must have the same color and when my program is running
and I change the colorscheme in Windows, I want to see
the new colors in my program.

I also must be able to calculate the difference between
two color.

You understand?
Example:
I have DynShape[1].Brush.Color:= $01000001, RGB=R1,G1,B1
I have DynShape[10].Brush.Color:=$01000011, RGB=R10,G10,B10

I calculate Rdelta:= (R10-R1) div (10 -9)
   {  Gdelta, Bdelta  same way}

Then I say, DynShape[2..9] you get the colors in between:

for x:=2 to 9
  DynShape[x].Brush.Color:=RGB(R1 + (x-1)*Rdelta,
                               G1  + (x-1) *Gdelta,
                               B1  + (x-1) * Bdelta).

Do you understand what I want Mirek?

I increase the points (only to 70, I don't have more).





 






0
Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 

Author Comment

by:yonasb
Comment Utility
Adjusted points to 70
0
 

Author Comment

by:yonasb
Comment Utility
Edited text of question
0
 
LVL 3

Expert Comment

by:mirek071497
Comment Utility
I think so now I know what you need, and as i say later you do this in bad way. If you set color as $01.... then you don't use system palette but current realized plette for control. You can read system palette entries with GetPaletteEntries (winapi) and then set color as $00BBGGRR where BB is blue GG is green RR is red. This can be done in TShape without limitation.

I post here example after some hours.
0
 
LVL 3

Accepted Solution

by:
mirek071497 earned 40 total points
Comment Utility
1.Change of color scheme don't change system palette! If you need use colors from Color scheme then you must usee constans defined in Graphics.Pas

clScrollBar = TColor(COLOR_SCROLLBAR or $80000000);
  clBackground = TColor(COLOR_BACKGROUND or $80000000);
  clActiveCaption = TColor(COLOR_ACTIVECAPTION or $80000000);
  clInactiveCaption = TColor(COLOR_INACTIVECAPTION or $80000000);
  clMenu = TColor(COLOR_MENU or $80000000);
and many other

2.If you need read system palette and use then this is example :

procedure TForm1.Button1Click(Sender: TObject);
var
  lk : integer;
  r,g,b : byte;

  function GetPalColor( nr : integer; var r,g,b : byte ) : TColor;
  var
    PalEntries : array[0..255] of TPaletteEntry;
    HowMany    : integer;
    l : longint;
    DC : HDC;
  begin
    DC := GetDC( Handle );  { retrive DC for form, it can be any valid DC }
    HowMany := GetSystemPaletteEntries( DC, 0, 255, PalEntries );
    ReleaseDC( Handle, DC );
    if nr>HowMany then
      ShowMessage( 'Palette have only '+IntToSTr(HowMany)+' entries' );
    l := PalEntries[nr].peBlue;
    l := l*256+PalEntries[nr].peGreen;
    l := l*256+PalEntries[nr].peRed;
    result := l;
    r := PalEntries[nr].peRed;
    g := PalEntries[nr].peGreen;
    b := PalEntries[nr].peBlue;
  end;

begin
  lk := 5;
  Shape1.Brush.Color := GetPalColor(lk,r,g,b);
  Shape2.Brush.Color := RGB( r,g,b );
end;

Do you need more ? Ask !
0
 
LVL 3

Expert Comment

by:mirek071497
Comment Utility
Hi
Are you there ?
0
 
LVL 3

Expert Comment

by:mirek071497
Comment Utility
Do you understand the colors ?
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
Delphi XE7 Rest Client 2 172
TcomboBox uninverted item 3 44
indy tidtcpclient threading issue 8 54
Virtuailstring tree compare node issue 14 89
Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…
Illustrator's Shape Builder tool will let you combine shapes visually and interactively. This video shows the Mac version, but the tool works the same way in Windows. To follow along with this video, you can draw your own shapes or download the file…

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

17 Experts available now in Live!

Get 1:1 Help Now