Menu

[r3207]: / trunk / Src / UClassHelpers.pas  Maximize  Restore  History

Download this file

182 lines (154 with data), 5.2 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
{
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at http://mozilla.org/MPL/2.0/
*
* Copyright (C) 2012-2013, Peter Johnson (www.delphidabbler.com).
*
* $Rev$
* $Date$
*
* Provides various class helpers for VCL classes.
}
unit UClassHelpers;
interface
uses
// Delphi
Controls, Menus, ImgList, Graphics, ActnList;
type
/// <summary>Class helper that adds functionality to TControl.</summary>
TControlHelper = class helper for TControl
public
/// <summary>Gets reference to pop-up menu assigned to protected PopupMenu
/// property.</summary>
function GetPopupMenu: TPopupMenu;
/// <summary>Checks if protected PopupMenu property is assigned.</summary>
function HasPopupMenu: Boolean;
/// <summary>Refreshes control's action. Any changes in action that affect
/// state of control are reflected in control.</summary>
procedure RefreshAction;
/// <summary>Refreshes all owned controls to reflect any changes in their
/// associated actions.</summary>
procedure RefreshActions;
end;
type
/// <summary>Class helper that adds a method to TCustomImageList that can
/// load images from resources of any type into the image list.</summary>
/// <remarks>By default TCustomImageList can only load images from Bitmap,
/// Cursor or Icon resources. Because of limitations of the resource compiler
/// used to build CodeSnip, 32 bit bitmaps can't be added to BITMAP resources
/// and so are stored in a format not supported by TCustomImageList.
/// </remarks>
TImageListHelper = class helper for TCustomImageList
public
/// <summary>Loads images from given resource.</summary>
/// <param name="ResType">PChar [in] Type of resource.</param>
/// <param name="ResName">string [in] Name of resource.</param>
/// <param name="Size">Integer [in] Size of individual images in resource
/// (must be square).</param>
/// <param name="MaskColour">TColor [in] Colour used as transparency mask.
/// </param>
/// <remarks>Resource is loaded from the current program instance.
/// </remarks>
procedure LoadFromResource(ResType: PChar; const ResName: string;
Size: Integer; MaskColour: TColor);
end;
type
/// <summary>Class helper that adds a method to TCustomActionList that can
/// update all the actions in the list.</summary>
TActionListHelper = class helper for TCustomActionList
public
/// <summary>Updates all actions in the action list by calling their Update
/// methods.</summary>
procedure Update;
end;
implementation
uses
// Delphi
Classes;
{ TControlHelper }
function TControlHelper.GetPopupMenu: TPopupMenu;
begin
Result := PopupMenu;
end;
function TControlHelper.HasPopupMenu: Boolean;
begin
Result := Assigned(PopupMenu);
end;
procedure TControlHelper.RefreshAction;
begin
if Assigned(Action) then
ActionChange(Action, False);
end;
procedure TControlHelper.RefreshActions;
var
Idx: Integer; // loops through all controls
begin
for Idx := 0 to Pred(ComponentCount) do
if Components[Idx] is TControl then
(Components[Idx] as TControl).RefreshAction;
end;
{ TImageListHelper }
procedure TImageListHelper.LoadFromResource(ResType: PChar;
const ResName: string; Size: Integer; MaskColour: TColor);
var
MasterBmp: TBitmap; // bitmap containing all images
Bmp: TBitmap; // a bitmap of a single image
RS: TResourceStream; // stream used to resources
LeftOffset: Integer; // left offset of an image in master
TopOffset: Integer; // top offset of an image in master
begin
// Set required size of images in image list
Width := Size;
Height := Size;
// Load master bitmap containing all images from resources.
MasterBmp := TBitmap.Create;
try
RS := TResourceStream.Create(HInstance, ResName, ResType);
try
MasterBmp.LoadFromStream(RS);
finally
RS.Free;
end;
// Split master bitmap into individual bitmaps and load them into image list
// create bitmap of correct size and bit depth: we re-use it for each bitmap
Bmp := TBitmap.Create;
try
Bmp.Width := Width;
Bmp.Height := Height;
Bmp.PixelFormat := MasterBmp.PixelFormat;
// scan across then down bitmaps: works for strips or rectangular master
// bitmaps
TopOffset := 0;
while TopOffset < MasterBmp.Height do
begin
LeftOffset := 0;
while LeftOffset < MasterBmp.Width do
begin
// copy the bitmap from the master into the image list
Bmp.Canvas.CopyRect(
Rect(0, 0, Width, Height),
MasterBmp.Canvas,
Bounds(LeftOffset, TopOffset, Width, Height)
);
Self.AddMasked(Bmp, clFuchsia);
Inc(LeftOffset, Width);
end;
Inc(TopOffset, Height);
end;
finally
Bmp.Free;
end;
finally
MasterBmp.Free;
end;
end;
{ TActionListHelper }
procedure TActionListHelper.Update;
var
Action: TContainedAction; // each action in list
begin
for Action in Self do
Action.Update;
end;
end.
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.