Move Industrial package from Lazarus sources to CCR.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5565 8e941d3f-bd1b-0410-a28a-d453659cc2b4
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 1.7 KiB |
105
components/industrialstuff/Example/Ex_IndustrialStuff.lpi
Normal file
@ -0,0 +1,105 @@
|
||||
<?xml version="1.0"?>
|
||||
<CONFIG>
|
||||
<ProjectOptions>
|
||||
<Version Value="9"/>
|
||||
<PathDelim Value="\"/>
|
||||
<General>
|
||||
<SessionStorage Value="InProjectDir"/>
|
||||
<MainUnit Value="0"/>
|
||||
<Title Value="Ex_IndustrialStuff"/>
|
||||
<ResourceType Value="res"/>
|
||||
<UseXPManifest Value="True"/>
|
||||
</General>
|
||||
<i18n>
|
||||
<EnableI18N LFM="False"/>
|
||||
</i18n>
|
||||
<VersionInfo>
|
||||
<StringTable ProductVersion=""/>
|
||||
</VersionInfo>
|
||||
<BuildModes Count="1">
|
||||
<Item1 Name="Default" Default="True"/>
|
||||
</BuildModes>
|
||||
<PublishOptions>
|
||||
<Version Value="2"/>
|
||||
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
|
||||
<ExcludeFileFilter Value="*.(bak|ppu|o|so);*~;backup"/>
|
||||
</PublishOptions>
|
||||
<RunParams>
|
||||
<local>
|
||||
<FormatVersion Value="1"/>
|
||||
</local>
|
||||
</RunParams>
|
||||
<RequiredPackages Count="2">
|
||||
<Item1>
|
||||
<PackageName Value="industrial"/>
|
||||
</Item1>
|
||||
<Item2>
|
||||
<PackageName Value="LCL"/>
|
||||
</Item2>
|
||||
</RequiredPackages>
|
||||
<Units Count="2">
|
||||
<Unit0>
|
||||
<Filename Value="Ex_IndustrialStuff.lpr"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="Ex_IndustrialStuff"/>
|
||||
</Unit0>
|
||||
<Unit1>
|
||||
<Filename Value="u_industrial.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="Form1"/>
|
||||
<HasResources Value="True"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="u_industrial"/>
|
||||
</Unit1>
|
||||
</Units>
|
||||
</ProjectOptions>
|
||||
<CompilerOptions>
|
||||
<Version Value="11"/>
|
||||
<PathDelim Value="\"/>
|
||||
<Target>
|
||||
<Filename Value="Ex_IndustrialStuff"/>
|
||||
</Target>
|
||||
<SearchPaths>
|
||||
<IncludeFiles Value="$(ProjOutDir)"/>
|
||||
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
|
||||
</SearchPaths>
|
||||
<CodeGeneration>
|
||||
<Checks>
|
||||
<IOChecks Value="True"/>
|
||||
<RangeChecks Value="True"/>
|
||||
<OverflowChecks Value="True"/>
|
||||
<StackChecks Value="True"/>
|
||||
</Checks>
|
||||
<Optimizations>
|
||||
<OptimizationLevel Value="2"/>
|
||||
</Optimizations>
|
||||
</CodeGeneration>
|
||||
<Linking>
|
||||
<LinkSmart Value="True"/>
|
||||
<Options>
|
||||
<Win32>
|
||||
<GraphicApplication Value="True"/>
|
||||
</Win32>
|
||||
</Options>
|
||||
</Linking>
|
||||
<Other>
|
||||
<CompilerMessages>
|
||||
<MsgFileName Value=""/>
|
||||
</CompilerMessages>
|
||||
<CompilerPath Value="$(CompPath)"/>
|
||||
</Other>
|
||||
</CompilerOptions>
|
||||
<Debugging>
|
||||
<Exceptions Count="3">
|
||||
<Item1>
|
||||
<Name Value="EAbort"/>
|
||||
</Item1>
|
||||
<Item2>
|
||||
<Name Value="ECodetoolError"/>
|
||||
</Item2>
|
||||
<Item3>
|
||||
<Name Value="EFOpenError"/>
|
||||
</Item3>
|
||||
</Exceptions>
|
||||
</Debugging>
|
||||
</CONFIG>
|
21
components/industrialstuff/Example/Ex_IndustrialStuff.lpr
Normal file
@ -0,0 +1,21 @@
|
||||
program Ex_IndustrialStuff;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
uses
|
||||
{$IFDEF UNIX}{$IFDEF UseCThreads}
|
||||
cthreads,
|
||||
{$ENDIF}{$ENDIF}
|
||||
Interfaces, // this includes the LCL widgetset
|
||||
Forms, u_industrial
|
||||
{ you can add units after this };
|
||||
|
||||
{$R *.res}
|
||||
|
||||
begin
|
||||
RequireDerivedFormResource := True;
|
||||
Application.Initialize;
|
||||
Application.CreateForm(TForm1, Form1);
|
||||
Application.Run;
|
||||
end.
|
||||
|
BIN
components/industrialstuff/Example/Ex_IndustrialStuff.res
Normal file
134
components/industrialstuff/Example/u_industrial.lfm
Normal file
@ -0,0 +1,134 @@
|
||||
object Form1: TForm1
|
||||
Left = 123
|
||||
Height = 166
|
||||
Top = 95
|
||||
Width = 568
|
||||
Caption = 'IndustrialStuff Example'
|
||||
ClientHeight = 166
|
||||
ClientWidth = 568
|
||||
LCLVersion = '1.1'
|
||||
object indLed1: TindLed
|
||||
Left = 200
|
||||
Height = 35
|
||||
Top = 33
|
||||
Width = 34
|
||||
LedValue = False
|
||||
Bevels = <
|
||||
item
|
||||
HighlightColor = clBlack
|
||||
ShadowColor = clBlack
|
||||
end
|
||||
item
|
||||
Width = 3
|
||||
end
|
||||
item
|
||||
Style = bcLowered
|
||||
end
|
||||
item
|
||||
HighlightColor = clBlack
|
||||
ShadowColor = clBlack
|
||||
end>
|
||||
LedColorOn = clLime
|
||||
LedColorOff = clGreen
|
||||
LedColorDisabled = 22963
|
||||
ShapeLedColorOn = clGreen
|
||||
ShapeLedColorOff = 16384
|
||||
ShapeLedColorDisabled = 13416
|
||||
end
|
||||
object StopLightSensor1: TStopLightSensor
|
||||
Left = 96
|
||||
Height = 59
|
||||
Top = 24
|
||||
Width = 25
|
||||
Center = True
|
||||
Picture.Data = {
|
||||
1754506F727461626C654E6574776F726B47726170686963EF00000089504E47
|
||||
0D0A1A0A0000000D49484452000000150000002B08020000001805541C000000
|
||||
B649444154789CED94010E84200C04FBF47B9A3FE304142AB5AD5B721763DCA0
|
||||
21C1D9D6BA919639D17A7DA24A296D3CE15AC11FF3ADCF089F5F8FA8AED3072C
|
||||
9EC39A85CA77389FAB161E5F15E7C5FA173F3B3F69017FBF6611CF8FABFBE7BF
|
||||
DCFB1EE08FF0B985959F8A9523D5C2E22B9C7F6FAC0B8017CDE3F5A505967F1B
|
||||
76F8C1E2CD3FCEEFD363FBEB3C87350B277F54226C58983CCB7FB3C0F2CF2B47
|
||||
EA4B0B2CFF36ECF083C5F3F3BF84B4F169427D48317D01F81FF539473C105700
|
||||
00000049454E44AE426082
|
||||
}
|
||||
State = slRED
|
||||
end
|
||||
object LEDNumber1: TLEDNumber
|
||||
Left = 32
|
||||
Height = 28
|
||||
Top = 116
|
||||
Width = 177
|
||||
Caption = 'Lazarus'
|
||||
OffColor = 930866
|
||||
OnColor = clLime
|
||||
end
|
||||
object AnalogSensor1: TAnalogSensor
|
||||
Left = 256
|
||||
Height = 136
|
||||
Top = 8
|
||||
Width = 153
|
||||
BorderWidth = 2
|
||||
BorderStyle = bsSingle
|
||||
Caption = 'level : '
|
||||
ClientHeight = 132
|
||||
ClientWidth = 149
|
||||
Font.Height = -16
|
||||
Font.Name = 'Arial'
|
||||
ParentColor = False
|
||||
ParentFont = False
|
||||
TabOrder = 0
|
||||
ShowText = True
|
||||
ShowLevel = True
|
||||
ColorFore = clLime
|
||||
ColorBack = clBlack
|
||||
Value = 20
|
||||
ValueMin = 0
|
||||
ValueMax = 100
|
||||
ValueRed = 30
|
||||
ValueYellow = 60
|
||||
AnalogKind = akVertical
|
||||
end
|
||||
object indGnouMeter1: TindGnouMeter
|
||||
Left = 424
|
||||
Height = 129
|
||||
Top = 17
|
||||
Width = 120
|
||||
Caption = 'indGnouMeter1'
|
||||
Value = 70
|
||||
Color = clPurple
|
||||
ParentColor = False
|
||||
ColorFore = clRed
|
||||
ColorBack = clInactiveCaption
|
||||
SignalUnit = 'Units'
|
||||
ValueMin = 0
|
||||
ValueMax = 100
|
||||
Digits = 0
|
||||
Increment = 10
|
||||
ShowIncrements = True
|
||||
Transparent = True
|
||||
GapTop = 20
|
||||
GapBottom = 10
|
||||
BarThickness = 5
|
||||
MarkerColor = clBlue
|
||||
ShowMarker = True
|
||||
end
|
||||
object Arrow1: TArrow
|
||||
Left = 48
|
||||
Height = 20
|
||||
Top = 41
|
||||
Width = 20
|
||||
Constraints.MinHeight = 8
|
||||
Constraints.MinWidth = 8
|
||||
end
|
||||
object AdvLed1: TAdvLed
|
||||
Left = 152
|
||||
Height = 24
|
||||
Top = 40
|
||||
Width = 24
|
||||
Kind = lkYellowLight
|
||||
State = lsOn
|
||||
Blink = False
|
||||
AutoSize = True
|
||||
end
|
||||
end
|
39
components/industrialstuff/Example/u_industrial.pas
Normal file
@ -0,0 +1,39 @@
|
||||
unit u_industrial;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, FileUtil, IndLed, Sensors, LedNumber,
|
||||
IndGnouMeter, AdvLed, Forms, Controls, Graphics, Dialogs, Arrow;
|
||||
|
||||
type
|
||||
|
||||
{ TForm1 }
|
||||
|
||||
TForm1 = class(TForm)
|
||||
AdvLed1: TAdvLed;
|
||||
AnalogSensor1: TAnalogSensor;
|
||||
Arrow1: TArrow;
|
||||
indGnouMeter1: TindGnouMeter;
|
||||
indLed1: TindLed;
|
||||
LEDNumber1: TLEDNumber;
|
||||
StopLightSensor1: TStopLightSensor;
|
||||
private
|
||||
|
||||
public
|
||||
|
||||
end;
|
||||
|
||||
var
|
||||
Form1: TForm1;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.lfm}
|
||||
|
||||
{ TForm1 }
|
||||
|
||||
end.
|
||||
|
95
components/industrialstuff/industrial.lpk
Normal file
@ -0,0 +1,95 @@
|
||||
<?xml version="1.0"?>
|
||||
<CONFIG>
|
||||
<Package Version="4">
|
||||
<PathDelim Value="\"/>
|
||||
<Name Value="industrial"/>
|
||||
<Author Value="Jurassic Pork"/>
|
||||
<CompilerOptions>
|
||||
<Version Value="11"/>
|
||||
<PathDelim Value="\"/>
|
||||
<SearchPaths>
|
||||
<IncludeFiles Value="source"/>
|
||||
<OtherUnitFiles Value="source"/>
|
||||
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
|
||||
</SearchPaths>
|
||||
<CodeGeneration>
|
||||
<SmartLinkUnit Value="True"/>
|
||||
<Optimizations>
|
||||
<OptimizationLevel Value="2"/>
|
||||
</Optimizations>
|
||||
</CodeGeneration>
|
||||
<Linking>
|
||||
<Debugging>
|
||||
<GenerateDebugInfo Value="False"/>
|
||||
</Debugging>
|
||||
</Linking>
|
||||
<Other>
|
||||
<CompilerMessages>
|
||||
<MsgFileName Value=""/>
|
||||
</CompilerMessages>
|
||||
<CompilerPath Value="$(CompPath)"/>
|
||||
</Other>
|
||||
</CompilerOptions>
|
||||
<Description Value="Industrial-themed (IPV/PCV) components and gauges (e.g. LEDs)."/>
|
||||
<License Value="MPL + GPL "/>
|
||||
<Version Minor="1"/>
|
||||
<Files Count="10">
|
||||
<Item1>
|
||||
<Filename Value="source\indled.pas"/>
|
||||
<UnitName Value="IndLed"/>
|
||||
</Item1>
|
||||
<Item2>
|
||||
<Filename Value="source\sensors.pas"/>
|
||||
<UnitName Value="Sensors"/>
|
||||
</Item2>
|
||||
<Item3>
|
||||
<Filename Value="source\AllIndustrialRegister.pas"/>
|
||||
<HasRegisterProc Value="True"/>
|
||||
<UnitName Value="AllIndustrialRegister"/>
|
||||
</Item3>
|
||||
<Item4>
|
||||
<Filename Value="source\lednumber.pas"/>
|
||||
<UnitName Value="LedNumber"/>
|
||||
</Item4>
|
||||
<Item5>
|
||||
<Filename Value="source\indgnoumeter.pas"/>
|
||||
<UnitName Value="IndGnouMeter"/>
|
||||
</Item5>
|
||||
<Item6>
|
||||
<Filename Value="source\AdvLed.pas"/>
|
||||
<UnitName Value="AdvLed"/>
|
||||
</Item6>
|
||||
<Item7>
|
||||
<Filename Value="source\indcyBaseLed.pas"/>
|
||||
<UnitName Value="indcyBaseLed"/>
|
||||
</Item7>
|
||||
<Item8>
|
||||
<Filename Value="source\indcyClasses.pas"/>
|
||||
<UnitName Value="indcyClasses"/>
|
||||
</Item8>
|
||||
<Item9>
|
||||
<Filename Value="source\indcyGraphics.pas"/>
|
||||
<UnitName Value="indcyGraphics"/>
|
||||
</Item9>
|
||||
<Item10>
|
||||
<Filename Value="source\indcyTypes.pas"/>
|
||||
<UnitName Value="indcyTypes"/>
|
||||
</Item10>
|
||||
</Files>
|
||||
<Type Value="RunAndDesignTime"/>
|
||||
<RequiredPkgs Count="1">
|
||||
<Item1>
|
||||
<PackageName Value="IDEIntf"/>
|
||||
</Item1>
|
||||
</RequiredPkgs>
|
||||
<UsageOptions>
|
||||
<UnitPath Value="$(PkgOutDir)"/>
|
||||
</UsageOptions>
|
||||
<PublishOptions>
|
||||
<Version Value="2"/>
|
||||
</PublishOptions>
|
||||
<CustomOptions Items="ExternHelp" Version="2">
|
||||
<_ExternHelp Items="Count"/>
|
||||
</CustomOptions>
|
||||
</Package>
|
||||
</CONFIG>
|
23
components/industrialstuff/industrial.pas
Normal file
@ -0,0 +1,23 @@
|
||||
{ This file was automatically created by Lazarus. Do not edit!
|
||||
This source is only used to compile and install the package.
|
||||
}
|
||||
|
||||
unit industrial;
|
||||
|
||||
{$warn 5023 off : no warning about unused units}
|
||||
interface
|
||||
|
||||
uses
|
||||
IndLed, Sensors, AllIndustrialRegister, LedNumber, indGnouMeter, AdvLed,
|
||||
indcyBaseLed, indcyClasses, indcyGraphics, indcyTypes, LazarusPackageIntf;
|
||||
|
||||
implementation
|
||||
|
||||
procedure Register;
|
||||
begin
|
||||
RegisterUnit('AllIndustrialRegister', @AllIndustrialRegister.Register);
|
||||
end;
|
||||
|
||||
initialization
|
||||
RegisterPackage('industrial', @Register);
|
||||
end.
|
BIN
components/industrialstuff/resources/black.png
Normal file
After Width: | Height: | Size: 775 B |
3
components/industrialstuff/resources/build.bat
Normal file
@ -0,0 +1,3 @@
|
||||
..\..\..\tools\lazres ..\source\sensors.res @sensors.txt
|
||||
..\..\..\tools\lazres ..\source\industrial_icons.res @industrial_icons.txt
|
||||
..\..\..\tools\lazres ..\source\ledbuttons.res @ledbuttons.txt
|
34
components/industrialstuff/resources/bulboff.xpm
Normal file
@ -0,0 +1,34 @@
|
||||
/* XPM */
|
||||
static char * LEDBULBOFF[] = {
|
||||
"15 15 16 1",
|
||||
" c #000000",
|
||||
". c #800000",
|
||||
"+ c #008000",
|
||||
"@ c #808000",
|
||||
"# c #000080",
|
||||
"$ c #800080",
|
||||
"% c #008080",
|
||||
"& c #808080",
|
||||
"* c #C0C0C0",
|
||||
"= c #FF0000",
|
||||
"- c #00FF00",
|
||||
"; c #FFFF00",
|
||||
"> c #0000FF",
|
||||
", c #FF00FF",
|
||||
"' c #00FFFF",
|
||||
") c #FFFFFF",
|
||||
"@@@@@@@@@@@@@@@",
|
||||
"@@@@@@@@@@@@@@@",
|
||||
"@@@@@@@@@@@@@@@",
|
||||
"@@@@@@@@@@@@@@@",
|
||||
"@@@@@@ @@@@@@",
|
||||
"@@@@@ ))) @@@@@",
|
||||
"@@@@ ))))) @@@@",
|
||||
"@@@@ ))&)) @@@@",
|
||||
"@@@@ ))&)) @@@@",
|
||||
"@@@@@ )&) @@@@@",
|
||||
"@@@@@@ ) @@@@@@",
|
||||
"@@@@@@ ) @@@@@@",
|
||||
"@@@@@@ @@@@@@",
|
||||
"@@@@@@ * @@@@@@",
|
||||
"@@@@@@ @@@@@@"};
|
34
components/industrialstuff/resources/bulbon.xpm
Normal file
@ -0,0 +1,34 @@
|
||||
/* XPM */
|
||||
static char * LEDBULBON[] = {
|
||||
"15 15 16 1",
|
||||
" c #000000",
|
||||
". c #800000",
|
||||
"+ c #008000",
|
||||
"@ c #808000",
|
||||
"# c #000080",
|
||||
"$ c #800080",
|
||||
"% c #008080",
|
||||
"& c #808080",
|
||||
"* c #C0C0C0",
|
||||
"= c #FF0000",
|
||||
"- c #00FF00",
|
||||
"; c #FFFF00",
|
||||
"> c #0000FF",
|
||||
", c #FF00FF",
|
||||
"' c #00FFFF",
|
||||
") c #FFFFFF",
|
||||
"@@@@@@@;@@@@@@@",
|
||||
"@@@@@@@;@@@@@@@",
|
||||
"@@;@@;;;;;@@;@@",
|
||||
"@@@;;;;;;;;;@@@",
|
||||
"@@@;;; ;;;@@@",
|
||||
"@@;;; );) ;;;@@",
|
||||
"@@;; ););) ;;@@",
|
||||
";;;; ;)&); ;;;;",
|
||||
"@@;; );&;) ;;@@",
|
||||
"@@;;; )&) ;;;@@",
|
||||
"@@@;;; ) ;;;@@@",
|
||||
"@@@;;; ; ;;;@@@",
|
||||
"@@;@@; ;@@;@@",
|
||||
"@@@@@@ * @@@@@@",
|
||||
"@@@@@@ @@@@@@"};
|
BIN
components/industrialstuff/resources/green.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
@ -0,0 +1,6 @@
|
||||
tadvled.png
|
||||
tanalogsensor.png
|
||||
tindgnoumeter.png
|
||||
tindled.png
|
||||
tlednumber.png
|
||||
tstoplightsensor.png
|
6
components/industrialstuff/resources/ledbuttons.txt
Normal file
@ -0,0 +1,6 @@
|
||||
black.png
|
||||
green.png
|
||||
red.png
|
||||
yellow.png
|
||||
bulboff.xpm
|
||||
bulbon.xpm
|
BIN
components/industrialstuff/resources/red.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
4
components/industrialstuff/resources/sensors.txt
Normal file
@ -0,0 +1,4 @@
|
||||
stop_green.png
|
||||
stop_red.png
|
||||
stop_unknown.png
|
||||
stop_yellow.png
|
BIN
components/industrialstuff/resources/stop_green.png
Normal file
After Width: | Height: | Size: 235 B |
BIN
components/industrialstuff/resources/stop_red.png
Normal file
After Width: | Height: | Size: 239 B |
BIN
components/industrialstuff/resources/stop_unknown.png
Normal file
After Width: | Height: | Size: 244 B |
BIN
components/industrialstuff/resources/stop_yellow.png
Normal file
After Width: | Height: | Size: 235 B |
BIN
components/industrialstuff/resources/tadvled.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
components/industrialstuff/resources/tanalogsensor.png
Normal file
After Width: | Height: | Size: 193 B |
BIN
components/industrialstuff/resources/tindadvled.png
Normal file
After Width: | Height: | Size: 787 B |
BIN
components/industrialstuff/resources/tindgnoumeter.png
Normal file
After Width: | Height: | Size: 363 B |
BIN
components/industrialstuff/resources/tindled.png
Normal file
After Width: | Height: | Size: 313 B |
BIN
components/industrialstuff/resources/tlednumber.png
Normal file
After Width: | Height: | Size: 219 B |
BIN
components/industrialstuff/resources/tstoplightsensor.png
Normal file
After Width: | Height: | Size: 258 B |
BIN
components/industrialstuff/resources/yellow.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
330
components/industrialstuff/source/AdvLed.pas
Normal file
@ -0,0 +1,330 @@
|
||||
(******************************************************
|
||||
AdvLed by Jurassic Pork 2013 for Lazarus
|
||||
created from TComled of ComPort Library ver. 3.00
|
||||
written by Dejan Crnila, 1998 - 2002
|
||||
email: dejancrn@yahoo.com
|
||||
****************************************************************************
|
||||
This file is part of Lazarus
|
||||
|
||||
See the file COPYING.modifiedLGPL.txt, included in this distribution,
|
||||
for details about the license.
|
||||
****************************************************************************
|
||||
Unit: AdvLed.pas
|
||||
******************************************************)
|
||||
|
||||
unit AdvLed;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
LCLType, Classes, ExtCtrls, Controls, Graphics;
|
||||
|
||||
type
|
||||
|
||||
// property types
|
||||
TLedBitmap = Graphics.TPicture;
|
||||
// TLedKind = (lkRedLight, lkGreenLight, lkBlueLight, lkYellowLight, lkPurpleLight, lkBulb, lkCustom);
|
||||
TLedKind = (lkRedLight, lkGreenLight, lkYellowLight, lkBulb, lkCustom);
|
||||
TLedState = (lsDisabled, lsOff, lsOn);
|
||||
TAdvLedGlyphs = array[TLedState] of TLedBitmap;
|
||||
TLedStateEvent = procedure(Sender: TObject; AState: TLedState) of object;
|
||||
|
||||
// led control that shows the state of serial signals
|
||||
TAdvLed = class(TCustomImage)
|
||||
private
|
||||
FKind: TLedKind;
|
||||
FState: TLedState;
|
||||
FBlink: Boolean;
|
||||
FOnChange: TLedStateEvent;
|
||||
FGlyphs: TAdvLedGlyphs;
|
||||
FBlinkTimer: TTimer;
|
||||
function GetGlyph(const Index: Integer): TLedBitmap;
|
||||
function GetBlinkDuration: Integer;
|
||||
procedure SetKind(const Value: TLedKind);
|
||||
procedure SetState(const Value: TLedState);
|
||||
procedure SetGlyph(const Index: Integer; const Value: TLedBitmap);
|
||||
procedure SetBlinkDuration(const Value: Integer);
|
||||
procedure SetBlink(const Value: Boolean);
|
||||
function StoredGlyph(const Index: Integer): Boolean;
|
||||
procedure SelectLedBitmap(const LedKind: TLedKind);
|
||||
function BitmapToDraw: TLedBitmap;
|
||||
procedure BitmapNeeded;
|
||||
procedure DoTimer(Sender: TObject);
|
||||
procedure GlyphChanged(Sender: TObject);
|
||||
|
||||
protected
|
||||
FlipFLop : Boolean;
|
||||
procedure DoChange(AState: TLedState); dynamic;
|
||||
procedure Loaded; override;
|
||||
public
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
destructor Destroy; override;
|
||||
|
||||
published
|
||||
// kind property must be published before GlyphOn, GlyphOff,GlyphDisable
|
||||
property Kind: TLedKind read FKind write SetKind default lkRedLight;
|
||||
property GlyphDisabled: TLedBitmap index 0 read GetGlyph
|
||||
write SetGlyph stored StoredGlyph;
|
||||
property GlyphOff: TLedBitmap index 1 read GetGlyph
|
||||
write SetGlyph stored StoredGlyph;
|
||||
property GlyphOn: TLedBitmap index 2 read GetGlyph
|
||||
write SetGlyph stored StoredGlyph;
|
||||
property State: TLedState read FState write SetState;
|
||||
property Blink: Boolean read FBlink write SetBlink;
|
||||
property BlinkDuration: Integer read GetBlinkDuration write SetBlinkDuration default 1000;
|
||||
property Align;
|
||||
property AutoSize default true;
|
||||
property Center;
|
||||
property Constraints;
|
||||
// property Picture;
|
||||
property Visible;
|
||||
property OnClick;
|
||||
property OnMouseDown;
|
||||
property OnMouseMove;
|
||||
property OnMouseUp;
|
||||
property Stretch;
|
||||
property Showhint;
|
||||
property Transparent;
|
||||
property Proportional;
|
||||
property OnPictureChanged;
|
||||
property OnChange: TLedStateEvent read FOnChange write FOnChange;
|
||||
|
||||
{ property Align;
|
||||
property DragCursor;
|
||||
property DragMode;
|
||||
property Enabled;
|
||||
property ParentShowHint;
|
||||
property PopupMenu;
|
||||
property ShowHint;
|
||||
property Visible;
|
||||
property Anchors;
|
||||
property Constraints;
|
||||
property DragKind;
|
||||
property ParentBiDiMode;
|
||||
|
||||
property OnClick;
|
||||
property OnDblClick;
|
||||
property OnDragDrop;
|
||||
property OnDragOver;
|
||||
property OnEndDrag;
|
||||
property OnMouseDown;
|
||||
property OnMouseMove;
|
||||
property OnMouseUp;
|
||||
property OnStartDrag;
|
||||
property OnEndDock;
|
||||
property OnResize;
|
||||
property OnStartDock;
|
||||
property OnContextPopup; }
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
{$R ledbuttons.res}
|
||||
|
||||
(*****************************************
|
||||
* auxilary functions *
|
||||
*****************************************)
|
||||
|
||||
function Min(A, B: Integer): Integer;
|
||||
begin
|
||||
if A < B then
|
||||
Result := A
|
||||
else
|
||||
Result := B;
|
||||
end;
|
||||
|
||||
function Max(A, B: Integer): Integer;
|
||||
begin
|
||||
if A > B then
|
||||
Result := A
|
||||
else
|
||||
Result := B;
|
||||
end;
|
||||
(*****************************************
|
||||
* TAdvLed control *
|
||||
*****************************************)
|
||||
|
||||
// create control
|
||||
constructor TAdvLed.Create(AOwner: TComponent);
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
ControlStyle := ControlStyle - [csSetCaption];
|
||||
AutoSize:=True;
|
||||
FGlyphs[lsOn] := TLedBitmap.Create;
|
||||
FGlyphs[lsOff] := TLedBitmap.Create;
|
||||
FGlyphs[lsDisabled] := TLedBitmap.Create;
|
||||
FGlyphs[lsOn].OnChange:= @GlyphChanged;
|
||||
FGlyphs[lsOff].OnChange:= @GlyphChanged;
|
||||
FGlyphs[lsDisabled].OnChange:= @GlyphChanged;
|
||||
FBlinkTimer := TTimer.Create(nil);
|
||||
FBlinkTimer.OnTimer := @DoTimer;
|
||||
FBlinkTimer.Enabled := false;
|
||||
if (csDesigning in ComponentState) then BitmapNeeded;
|
||||
end;
|
||||
|
||||
// destroy control
|
||||
destructor TAdvLed.Destroy;
|
||||
begin
|
||||
FBlinkTimer.Free;
|
||||
FGlyphs[lsOn].Free;
|
||||
FGlyphs[lsOff].Free;
|
||||
FGlyphs[lsDisabled].Free;
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
// loaded
|
||||
procedure TAdvLed.Loaded;
|
||||
begin
|
||||
Try
|
||||
If (csDesigning in ComponentState) Then Exit ;
|
||||
// Load Bitmap if necessary
|
||||
BitmapNeeded;
|
||||
Finally
|
||||
inherited Loaded;
|
||||
End;
|
||||
end;
|
||||
|
||||
// timer
|
||||
procedure TAdvLed.DoTimer(Sender: TObject);
|
||||
begin
|
||||
if FlipFlop then
|
||||
SetState(lsOn )
|
||||
else
|
||||
SetState(lsoff);
|
||||
FlipFlop := Not FlipFlop;
|
||||
end;
|
||||
|
||||
// trigger OnChangeEvent
|
||||
procedure TAdvLed.DoChange(AState: TLedState);
|
||||
begin
|
||||
if Assigned(FOnChange) then
|
||||
FOnChange(Self, AState);
|
||||
invalidate;
|
||||
end;
|
||||
|
||||
// if bitmap is empty, load it
|
||||
procedure TAdvLed.BitmapNeeded;
|
||||
begin
|
||||
if (FGlyphs[lsOn].Bitmap.Empty) or (FGlyphs[lsOff].Bitmap.Empty) or
|
||||
(FGlyphs[lsDisabled].Bitmap.Empty) then
|
||||
begin
|
||||
SelectLedBitmap(FKind);
|
||||
Picture.Assign(BitmapToDraw);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TAdvLed.SelectLedBitmap(const LedKind: TLedKind);
|
||||
const
|
||||
{ OnBitmaps: array[TLedKind] of string = ('LEDREDON', 'LEDGREENON', 'LEDBLUEON',
|
||||
'LEDYELLOWON', 'LEDPURPLEON', 'LEDBULBON', '');
|
||||
OffBitmaps: array[TLedKind] of string = ('LEDREDOFF', 'LEDGREENOFF',
|
||||
'LEDBLUEOFF', 'LEDYELLOWOFF', 'LEDPURPLEOFF', 'LEDBULBOFF' ,'');
|
||||
DisabledBitmaps: array[TLedKind] of string = ('LEDREDOFF', 'LEDGREENOFF',
|
||||
'LEDBLUEOFF', 'LEDYELLOWOFF', 'LEDPURPLEOFF', 'LEDBULBOFF' ,''); }
|
||||
OnBitmaps: array[TLedKind] of string = ('RED', 'GREEN', 'YELLOW', 'BULBON', '');
|
||||
OffBitmaps: array[TLedKind] of string = ('BLACK', 'BLACK', 'BLACK','BULBOFF', '');
|
||||
DisabledBitmaps: array[TLedKind] of string = ('BLACK', 'BLACK', 'BLACK','BULBOFF' ,'');
|
||||
begin
|
||||
if LedKind <> lkCustom then
|
||||
begin
|
||||
FGlyphs[lsOn].LoadFromResourceName(HInstance, OnBitmaps[LedKind]);
|
||||
FGlyphs[lsOff].LoadFromResourceName(HInstance, OffBitmaps[LedKind]);
|
||||
FGlyphs[lsDisabled].LoadFromResourceName(HInstance, DisabledBitmaps[LedKind]);
|
||||
end;
|
||||
end;
|
||||
|
||||
// set led kind
|
||||
procedure TAdvLed.SetKind(const Value: TLedKind);
|
||||
begin
|
||||
if FKind <> Value then
|
||||
begin
|
||||
FKind := Value;
|
||||
SelectLedBitmap(FKind);
|
||||
Picture.Assign(BitmapToDraw);
|
||||
end;
|
||||
end;
|
||||
|
||||
// set led state
|
||||
procedure TAdvLed.SetState(const Value: TLedState);
|
||||
begin
|
||||
FState := Value;
|
||||
if not (csLoading in ComponentState) then
|
||||
DoChange(FState);
|
||||
Picture.Assign(BitmapToDraw);
|
||||
end;
|
||||
|
||||
function TAdvLed.GetGlyph(const Index: Integer): TLedBitmap;
|
||||
begin
|
||||
case Index of
|
||||
0: Result := FGlyphs[lsDisabled];
|
||||
1: Result := FGlyphs[lsOff];
|
||||
2: Result := FGlyphs[lsOn];
|
||||
else
|
||||
Result := nil;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TAdvLed.GlyphChanged(Sender: TObject );
|
||||
begin
|
||||
// if (csDesigning in ComponentState) then Picture.Assign(Sender as TPicture);
|
||||
if (csDesigning in ComponentState) then
|
||||
begin
|
||||
if Sender = FGlyphs[lsDisabled] then FState := lsDisabled;
|
||||
if Sender = FGlyphs[lsOff] then FState := lsOff;
|
||||
if Sender = FGlyphs[lsOn] then FState := lsOn;
|
||||
Picture.Assign(Sender as TPicture);
|
||||
end;
|
||||
end;
|
||||
|
||||
// set custom bitmap
|
||||
procedure TAdvLed.SetGlyph(const Index: Integer; const Value: TLedBitmap);
|
||||
begin
|
||||
if FKind = lkCustom then
|
||||
begin
|
||||
case Index of
|
||||
0: FGlyphs[lsDisabled].Assign(Value);
|
||||
1: FGlyphs[lsOff].Assign(Value);
|
||||
2: FGlyphs[lsOn].Assign(Value);
|
||||
end;
|
||||
end;
|
||||
Picture.Assign(BitmapToDraw);
|
||||
end;
|
||||
|
||||
function TAdvLed.StoredGlyph(const Index: Integer): Boolean;
|
||||
begin
|
||||
Result := FKind = lkCustom;
|
||||
end;
|
||||
|
||||
// get bitmap for drawing
|
||||
function TAdvLed.BitmapToDraw: TLedBitmap;
|
||||
var
|
||||
ToDraw: TLedState;
|
||||
begin
|
||||
if not Enabled then
|
||||
ToDraw := lsOff
|
||||
else
|
||||
ToDraw := FState;
|
||||
Result := FGlyphs[ToDraw];
|
||||
end;
|
||||
|
||||
function TAdvLed.GetBlinkDuration: Integer;
|
||||
begin
|
||||
Result := FBlinkTimer.Interval;
|
||||
end;
|
||||
|
||||
procedure TAdvLed.SetBlinkDuration(const Value: Integer);
|
||||
begin
|
||||
FBlinkTimer.Interval := Value;
|
||||
end;
|
||||
|
||||
// set led blink
|
||||
procedure TAdvLed.SetBlink(const Value: Boolean);
|
||||
begin
|
||||
FBlink :=Value;
|
||||
if (csDesigning in ComponentState) then Exit;
|
||||
FBlinkTimer.Enabled := FBlink;
|
||||
end;
|
||||
|
||||
end.
|
30
components/industrialstuff/source/AllIndustrialRegister.pas
Normal file
@ -0,0 +1,30 @@
|
||||
|
||||
{**********************************************************************
|
||||
Package industrial Lazarus
|
||||
|
||||
This unit is part of Lazarus Project
|
||||
***********************************************************************}
|
||||
|
||||
unit AllIndustrialRegister;
|
||||
|
||||
interface
|
||||
|
||||
|
||||
uses
|
||||
Classes, LResources, AdvLed, IndLed, LedNumber, Sensors, IndGnouMeter;
|
||||
|
||||
procedure Register;
|
||||
|
||||
implementation
|
||||
|
||||
{$R industrial_icons.res}
|
||||
|
||||
//==========================================================
|
||||
procedure Register;
|
||||
begin
|
||||
RegisterComponents ('Industrial',[
|
||||
TAdvLed, TIndLed, TLedNumber, TStopLightSensor, TAnalogSensor, TindGnouMeter]);
|
||||
|
||||
end;
|
||||
|
||||
end.
|
228
components/industrialstuff/source/indcyBaseLed.pas
Normal file
@ -0,0 +1,228 @@
|
||||
{ Component(s):
|
||||
tcyBaseLed
|
||||
|
||||
Description:
|
||||
A base led component with Group feature
|
||||
Led states : ON/OFF/DISABLE
|
||||
|
||||
* ***** BEGIN LICENSE BLOCK *****
|
||||
*
|
||||
* Version: MPL 1.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
||||
* the specific language governing rights and limitations under the License.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Mauricio
|
||||
* (https://sourceforge.net/projects/tcycomponents/).
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or the
|
||||
* GNU Lesser General Public License Version 2.1 or later (the "LGPL"), in which
|
||||
* case the provisions of the GPL or the LGPL are applicable instead of those
|
||||
* above. If you wish to allow use of your version of this file only under the
|
||||
* terms of either the GPL or the LGPL, and not to allow others to use your
|
||||
* version of this file under the terms of the MPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice and other
|
||||
* provisions required by the LGPL or the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file under the
|
||||
* terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK *****}
|
||||
|
||||
unit indcyBaseLed;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses LCLIntf, LCLType, LMessages, Messages, Classes, Types, Controls, Graphics;
|
||||
|
||||
type
|
||||
TLedStatus = (lsOn, lsOff, lsDisabled);
|
||||
|
||||
TcyBaseLed = class(TGraphicControl)
|
||||
private
|
||||
FGroupIndex: Integer;
|
||||
FAllowAllOff: Boolean;
|
||||
FLedValue: Boolean;
|
||||
FReadOnly: Boolean;
|
||||
procedure SetAllowAllOff(Value: Boolean);
|
||||
procedure SetGroupIndex(Value: Integer);
|
||||
procedure UpdateExclusive;
|
||||
protected
|
||||
procedure Click; override;
|
||||
procedure Loaded; override;
|
||||
procedure SetEnabled(Value: Boolean); override;
|
||||
procedure CMButtonPressed(var Message: TLMessage); message CM_BUTTONPRESSED; // Called in UpdateExclusive procedure ...
|
||||
function TransparentColorAtPos(Point: TPoint): boolean; virtual;
|
||||
procedure LedStatusChanged; virtual;
|
||||
procedure SetInternalLedValue(Value: Boolean);
|
||||
function GetLedStatus: TLedStatus; virtual;
|
||||
procedure SetLedvalue(Value: Boolean); virtual;
|
||||
procedure SetReadOnly(AValue: Boolean); virtual;
|
||||
property AllowAllOff: Boolean read FAllowAllOff write SetAllowAllOff default false;
|
||||
property GroupIndex: Integer read FGroupIndex write SetGroupIndex default 0;
|
||||
property LedValue: Boolean read FLedvalue write SetLedvalue;
|
||||
property ReadOnly: Boolean read FReadOnly write SetReadOnly default false;
|
||||
public
|
||||
property Canvas;
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
property LedStatus: TLedStatus read GetLedStatus;
|
||||
procedure Switch;
|
||||
published
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
constructor TcyBaseLed.Create(AOwner: TComponent);
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
FAllowAllOff := false;
|
||||
FGroupIndex := 0;
|
||||
FLedvalue:= false;
|
||||
FReadOnly := false;
|
||||
end;
|
||||
|
||||
procedure TcyBaseLed.LedStatusChanged;
|
||||
begin
|
||||
Invalidate;
|
||||
end;
|
||||
|
||||
procedure TcyBaseLed.Loaded;
|
||||
begin
|
||||
Inherited;
|
||||
ControlStyle := ControlStyle - [csDoubleClicks];
|
||||
end;
|
||||
|
||||
procedure TcyBaseLed.SetReadOnly(AValue: Boolean);
|
||||
begin
|
||||
if AValue <> FReadOnly
|
||||
then FReadOnly := AValue;
|
||||
end;
|
||||
|
||||
procedure TcyBaseLed.SetEnabled(Value: Boolean);
|
||||
begin
|
||||
Inherited;
|
||||
LedStatusChanged;
|
||||
end;
|
||||
|
||||
function TcyBaseLed.TransparentColorAtPos(Point: TPoint): boolean;
|
||||
begin
|
||||
RESULT := false;
|
||||
end;
|
||||
|
||||
procedure TcyBaseLed.Click;
|
||||
var aPt: TPoint;
|
||||
begin
|
||||
if not FReadOnly
|
||||
then begin
|
||||
GetCursorPos(aPt);
|
||||
aPt := Self.ScreenToClient(aPt);
|
||||
|
||||
if Not TransparentColorAtPos(aPt)
|
||||
then LedValue := not FLedValue;
|
||||
end;
|
||||
|
||||
Inherited;
|
||||
end;
|
||||
|
||||
function TcyBaseLed.GetLedStatus: TLedStatus;
|
||||
begin
|
||||
if not Enabled
|
||||
then
|
||||
RESULT := lsDisabled
|
||||
else
|
||||
if FLedValue
|
||||
then RESULT := lsOn
|
||||
else RESULT := lsOff;
|
||||
end;
|
||||
|
||||
// Procedure to force changing value :
|
||||
procedure TcyBaseLed.SetInternalLedValue(Value: Boolean);
|
||||
begin
|
||||
if FLedValue <> Value
|
||||
then begin
|
||||
FLedValue := Value;
|
||||
LedStatusChanged;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TcyBaseLed.Switch;
|
||||
begin
|
||||
LedValue := not FLedValue;
|
||||
end;
|
||||
|
||||
procedure TcyBaseLed.SetLedvalue(Value: Boolean);
|
||||
begin
|
||||
if Value <> FLedvalue
|
||||
then begin
|
||||
if (not Value) and (not FAllowAllOff) and (FGroupIndex <> 0)
|
||||
then Exit; // Can't turn off all leds of the same group ...
|
||||
|
||||
FLedvalue := Value;
|
||||
LedStatusChanged;
|
||||
|
||||
if Value
|
||||
then UpdateExclusive; // Send message to turn off the other one ...
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TcyBaseLed.SetAllowAllOff(Value: Boolean);
|
||||
begin
|
||||
if FAllowAllOff <> Value
|
||||
then begin
|
||||
FAllowAllOff := Value;
|
||||
UpdateExclusive; // Inform FAllowAllOff value to the others from the same group
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TcyBaseLed.SetGroupIndex(Value: Integer);
|
||||
begin
|
||||
if FGroupIndex <> Value
|
||||
then begin
|
||||
FGroupIndex := Value;
|
||||
UpdateExclusive;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TcyBaseLed.UpdateExclusive;
|
||||
var
|
||||
Msg: TMessage;
|
||||
begin
|
||||
if (FGroupIndex <> 0) and (Parent <> nil)
|
||||
then begin
|
||||
Msg.Msg := CM_BUTTONPRESSED;
|
||||
Msg.WParam := FGroupIndex;
|
||||
Msg.LParam := PtrInt(Self);
|
||||
Msg.Result := 0;
|
||||
Parent.Broadcast(Msg);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TcyBaseLed.CMButtonPressed(var Message: TLMessage);
|
||||
var Sender: TcyBaseLed;
|
||||
begin
|
||||
if (csLoading in ComponentState) then exit;
|
||||
|
||||
if Message.WParam = FGroupIndex // Same group?
|
||||
then begin
|
||||
Sender := TcyBaseLed(Message.LParam);
|
||||
if Sender <> Self
|
||||
then begin
|
||||
if Sender.LedValue and FLedValue // Only one can be turn on on group mode ...
|
||||
then begin;
|
||||
FLedValue := false;
|
||||
LedStatusChanged;
|
||||
end;
|
||||
|
||||
FAllowAllOff := Sender.AllowAllOff;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
end.
|
307
components/industrialstuff/source/indcyClasses.pas
Normal file
@ -0,0 +1,307 @@
|
||||
{ Unit indcyClasses from cyClasses
|
||||
|
||||
Description:
|
||||
Unit with sub-properties for components.
|
||||
|
||||
|
||||
* ***** BEGIN LICENSE BLOCK *****
|
||||
*
|
||||
* Version: MPL 1.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
||||
* the specific language governing rights and limitations under the License.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Mauricio
|
||||
* (https://sourceforge.net/projects/tcycomponents/).
|
||||
*
|
||||
* No contributors for now ...
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or the
|
||||
* GNU Lesser General Public License Version 2.1 or later (the "LGPL"), in which
|
||||
* case the provisions of the GPL or the LGPL are applicable instead of those
|
||||
* above. If you wish to allow use of your version of this file only under the
|
||||
* terms of either the GPL or the LGPL, and not to allow others to use your
|
||||
* version of this file under the terms of the MPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice and other
|
||||
* provisions required by the LGPL or the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file under the
|
||||
* terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK *****}
|
||||
|
||||
unit indcyClasses;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
// {$I cyCompilerDefines.inc}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
LCLIntf, Classes, Graphics, Controls, SysUtils,
|
||||
indcyTypes, indcyGraphics;
|
||||
|
||||
type
|
||||
tcyBevel = class(TCollectionItem)
|
||||
private
|
||||
FHighlightColor: TColor;
|
||||
FShadowColor: TColor;
|
||||
FWidth: Word;
|
||||
FStyle: TcyBevelCut;
|
||||
FDrawRight: Boolean;
|
||||
FDrawLeft: Boolean;
|
||||
FDrawTop: Boolean;
|
||||
FDrawBottom: Boolean;
|
||||
FNeedOwnerRealign: Boolean;
|
||||
procedure SetHighlightColor(const Value: TColor);
|
||||
procedure SetShadowColor(const Value: TColor);
|
||||
procedure SetWidth(const Value: Word);
|
||||
procedure SetStyle(const Value: TcyBevelCut);
|
||||
procedure SetDrawBottom(const Value: Boolean);
|
||||
procedure SetDrawLeft(const Value: Boolean);
|
||||
procedure SetDrawRight(const Value: Boolean);
|
||||
procedure SetDrawTop(const Value: Boolean);
|
||||
protected
|
||||
function GetDisplayName: string; override;
|
||||
public
|
||||
constructor Create(ACollection: TCollection); override;
|
||||
procedure Assign(Source: TPersistent); override;
|
||||
published
|
||||
property DrawLeft: Boolean read FDrawLeft write SetDrawLeft default True;
|
||||
property DrawTop: Boolean read FDrawTop write SetDrawTop default True;
|
||||
property DrawRight: Boolean read FDrawRight write SetDrawRight default True;
|
||||
property DrawBottom: Boolean read FDrawBottom write SetDrawBottom default True;
|
||||
property HighlightColor: TColor read FHighlightColor write SetHighlightColor default clBtnHighlight;
|
||||
property ShadowColor: TColor read FShadowColor write SetShadowColor default clBtnShadow;
|
||||
property Style: TcyBevelCut read FStyle write SetStyle default bcRaised;
|
||||
property Width: Word read FWidth write SetWidth default 1;
|
||||
end;
|
||||
|
||||
TcyBevelClass = class of tcyBevel;
|
||||
|
||||
tcyBevels = Class(TCollection)
|
||||
private
|
||||
FControl: TControl;
|
||||
FOnChange: TNotifyEvent;
|
||||
FNeedOwnerRealign: Boolean;
|
||||
function GetBevel(Index: Integer): TcyBevel;
|
||||
protected
|
||||
function GetOwner: TPersistent; Override;
|
||||
procedure Update(Item: TCollectionItem); Override;
|
||||
public
|
||||
constructor Create(aControl: TControl; BevelClass: TcyBevelClass);
|
||||
function Add: TcyBevel;
|
||||
procedure Delete(Index: Integer);
|
||||
procedure DrawBevels(aCanvas: TCanvas; var BoundsRect: TRect; RoundRect: Boolean);
|
||||
function xBevelsWidth: Integer;
|
||||
function BevelsWidth: Integer;
|
||||
property Items[Index: Integer]: TcyBevel read GetBevel; default;
|
||||
property NeedOwnerRealign: Boolean read FNeedOwnerRealign;
|
||||
property OnChange: TNotifyEvent read FOnChange write FOnChange;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
{ tcyBevel }
|
||||
procedure tcyBevel.Assign(Source: TPersistent);
|
||||
begin
|
||||
if Source is tcyBevel then
|
||||
begin
|
||||
FHighlightColor := tcyBevel(Source).FHighlightColor;
|
||||
FShadowColor := tcyBevel(Source).FShadowColor;
|
||||
FWidth := tcyBevel(Source).FWidth;
|
||||
FStyle := tcyBevel(Source).FStyle;
|
||||
FDrawRight := tcyBevel(Source).FDrawRight;
|
||||
FDrawLeft := tcyBevel(Source).FDrawLeft;
|
||||
FDrawTop := tcyBevel(Source).FDrawTop;
|
||||
FDrawBottom := tcyBevel(Source).FDrawBottom;
|
||||
end;
|
||||
// inherited Assign(Source);
|
||||
end;
|
||||
|
||||
constructor tcyBevel.Create(ACollection: TCollection);
|
||||
begin
|
||||
inherited Create(ACollection);
|
||||
FHighlightColor := clBtnHighlight;
|
||||
FShadowColor := clBtnShadow;
|
||||
FWidth := 1;
|
||||
FStyle := bcRaised;
|
||||
FDrawLeft := true;
|
||||
FDrawTop := true;
|
||||
FDrawRight := true;
|
||||
FDrawBottom := true;
|
||||
FNeedOwnerRealign := true;
|
||||
end;
|
||||
|
||||
function tcyBevel.GetDisplayName: string;
|
||||
begin
|
||||
case FStyle of
|
||||
bcLowered: Result := 'Lowered';
|
||||
bcRaised: Result := 'Raised';
|
||||
bcNone: Result := 'None';
|
||||
bcTransparent: Result := 'Transparent';
|
||||
end;
|
||||
|
||||
Result := Result + ' Bevel';
|
||||
Result := Result + ' Width = ' + intToStr(FWidth);
|
||||
end;
|
||||
|
||||
procedure tcyBevel.SetDrawBottom(const Value: Boolean);
|
||||
begin
|
||||
FDrawBottom := Value;
|
||||
Changed(false); // It will call TcyBevels.Update !
|
||||
end;
|
||||
|
||||
procedure tcyBevel.SetDrawLeft(const Value: Boolean);
|
||||
begin
|
||||
FDrawLeft := Value;
|
||||
Changed(false);
|
||||
end;
|
||||
|
||||
procedure tcyBevel.SetDrawRight(const Value: Boolean);
|
||||
begin
|
||||
FDrawRight := Value;
|
||||
Changed(false);
|
||||
end;
|
||||
|
||||
procedure tcyBevel.SetDrawTop(const Value: Boolean);
|
||||
begin
|
||||
FDrawTop := Value;
|
||||
Changed(false);
|
||||
end;
|
||||
|
||||
procedure tcyBevel.SetHighlightColor(const Value: TColor);
|
||||
begin
|
||||
FHighlightColor := Value;
|
||||
Changed(false);
|
||||
end;
|
||||
|
||||
procedure tcyBevel.SetShadowColor(const Value: TColor);
|
||||
begin
|
||||
FShadowColor := Value;
|
||||
Changed(false);
|
||||
end;
|
||||
|
||||
procedure tcyBevel.SetStyle(const Value: TcyBevelCut);
|
||||
begin
|
||||
if FStyle = Value then EXIT;
|
||||
|
||||
if (FStyle = bcNone) or (Value = bcNone)
|
||||
then FNeedOwnerRealign := true;
|
||||
|
||||
FStyle := Value;
|
||||
Changed(false);
|
||||
end;
|
||||
|
||||
procedure tcyBevel.SetWidth(const Value: Word);
|
||||
begin
|
||||
if FWidth = Value then EXIT;
|
||||
|
||||
FWidth := Value;
|
||||
FNeedOwnerRealign := true;
|
||||
Changed(false);
|
||||
end;
|
||||
|
||||
{TcyBevels}
|
||||
constructor TcyBevels.Create(aControl: TControl; BevelClass: TcyBevelClass);
|
||||
begin
|
||||
inherited Create(BevelClass);
|
||||
FControl := aControl;
|
||||
FNeedOwnerRealign := false;
|
||||
end;
|
||||
|
||||
function TcyBevels.GetBevel(Index: Integer): TcyBevel;
|
||||
begin
|
||||
Result := TcyBevel(inherited Items[Index]);
|
||||
end;
|
||||
|
||||
function TcyBevels.GetOwner: TPersistent;
|
||||
begin
|
||||
Result := FControl;
|
||||
end;
|
||||
|
||||
// Event Called by setting properties/events of TcyBevel :
|
||||
procedure TcyBevels.Update(Item: TCollectionItem);
|
||||
begin
|
||||
Inherited;
|
||||
if Assigned(FOnChange)
|
||||
then begin
|
||||
if Item <> nil
|
||||
then
|
||||
if TcyBevel(Item).FNeedOwnerRealign
|
||||
then begin
|
||||
FNeedOwnerRealign := true;
|
||||
TcyBevel(Item).FNeedOwnerRealign := false;
|
||||
end;
|
||||
|
||||
FOnChange(Self);
|
||||
FNeedOwnerRealign := false;
|
||||
end
|
||||
else
|
||||
FControl.Invalidate;
|
||||
end;
|
||||
|
||||
function TcyBevels.Add: TcyBevel;
|
||||
begin
|
||||
Result := TcyBevel(inherited Add);
|
||||
Result.Changed(false); // It will call TcyBevels.Update only at run-time!
|
||||
end;
|
||||
|
||||
procedure TcyBevels.Delete(Index: Integer);
|
||||
begin
|
||||
Inherited;
|
||||
FNeedOwnerRealign := true;
|
||||
Update(Nil);
|
||||
end;
|
||||
|
||||
procedure TcyBevels.DrawBevels(aCanvas: TCanvas; var BoundsRect: TRect; RoundRect: Boolean);
|
||||
var i: Integer;
|
||||
begin
|
||||
for i := 0 to Count-1 do
|
||||
case Items[i].FStyle of
|
||||
bcRaised:
|
||||
begin
|
||||
cyFrame3D(aCanvas, BoundsRect, Items[i].FHighlightColor, Items[i].FShadowColor, Items[i].FWidth,
|
||||
Items[i].FDrawLeft, Items[i].FDrawTop, Items[i].FDrawRight, Items[i].FDrawBottom, RoundRect);
|
||||
RoundRect := false;
|
||||
end;
|
||||
|
||||
bcLowered:
|
||||
begin
|
||||
cyFrame3D(aCanvas, BoundsRect, Items[i].FShadowColor, Items[i].FHighlightColor, Items[i].FWidth,
|
||||
Items[i].FDrawLeft, Items[i].FDrawTop, Items[i].FDrawRight, Items[i].FDrawBottom, RoundRect);
|
||||
RoundRect := false;
|
||||
end;
|
||||
|
||||
bcTransparent: // Just Inflate Rect
|
||||
begin
|
||||
InflateRect(BoundsRect, (-1) * Items[i].FWidth, (-1) * Items[i].FWidth);
|
||||
RoundRect := false;
|
||||
end;
|
||||
|
||||
bcNone: ;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TcyBevels.xBevelsWidth: Integer;
|
||||
begin
|
||||
RESULT := 0;
|
||||
end;
|
||||
|
||||
// 9999 for All other units like TcySimpleGauge
|
||||
function TcyBevels.BevelsWidth: Integer;
|
||||
var i: Integer;
|
||||
begin
|
||||
RESULT := 0;
|
||||
for i := 0 to Count-1 do
|
||||
if Items[i].FStyle <> bcNone
|
||||
then Inc(RESULT, Items[i].FWidth);
|
||||
end;
|
||||
|
||||
end.
|
198
components/industrialstuff/source/indcyGraphics.pas
Normal file
@ -0,0 +1,198 @@
|
||||
{ Unit indcyGraphics from cyGraphics
|
||||
|
||||
Description:
|
||||
Unit with graphic functions
|
||||
|
||||
* ***** BEGIN LICENSE BLOCK *****
|
||||
*
|
||||
* Version: MPL 1.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
||||
* the specific language governing rights and limitations under the License.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Mauricio
|
||||
* (https://sourceforge.net/projects/tcycomponents/).
|
||||
*
|
||||
* No contributors for now ...
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or the
|
||||
* GNU Lesser General Public License Version 2.1 or later (the "LGPL"), in which
|
||||
* case the provisions of the GPL or the LGPL are applicable instead of those
|
||||
* above. If you wish to allow use of your version of this file only under the
|
||||
* terms of either the GPL or the LGPL, and not to allow others to use your
|
||||
* version of this file under the terms of the MPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice and other
|
||||
* provisions required by the LGPL or the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file under the
|
||||
* terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK *****}
|
||||
|
||||
unit indcyGraphics;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
// {$I cyCompilerDefines.inc}
|
||||
|
||||
interface
|
||||
|
||||
// We need to put jpeg to the uses for avoid run-time not handled jpeg image ...
|
||||
uses
|
||||
LCLIntf, LCLType, Types, Classes, Forms, Graphics, Math, Buttons, Controls,
|
||||
ExtCtrls, SysUtils, indcyTypes;
|
||||
|
||||
// Objects painting functions :
|
||||
procedure cyFrame3D(Canvas: TCanvas; var Rect: TRect; TopLeftColor, BottomRightColor: TColor; Width: Integer;
|
||||
const DrawLeft: Boolean = true; const DrawTop: Boolean = true; const DrawRight: Boolean = true; const DrawBottom: Boolean = true;
|
||||
const RoundRect: boolean = false);
|
||||
|
||||
// TPicture and TGraphic functions:
|
||||
function PictureIsTransparentAtPos(aPicture: TPicture; aPoint: TPoint): boolean;
|
||||
function IconIsTransparentAtPos(aIcon: TIcon; aPoint: TPoint): boolean;
|
||||
function ValidGraphic(aGraphic: TGraphic): Boolean;
|
||||
|
||||
// Other functions:
|
||||
function PointInEllipse(const aPt: TPoint; const aRect: TRect): boolean;
|
||||
|
||||
implementation
|
||||
|
||||
{ Procedures and functions}
|
||||
|
||||
procedure cyFrame3D(Canvas: TCanvas; var Rect: TRect; TopLeftColor, BottomRightColor: TColor; Width: Integer;
|
||||
const DrawLeft: Boolean = true; const DrawTop: Boolean = true; const DrawRight: Boolean = true; const DrawBottom: Boolean = true;
|
||||
const RoundRect: boolean = false);
|
||||
var incValue: Integer;
|
||||
|
||||
procedure DrawLines;
|
||||
begin
|
||||
with Canvas, Rect do
|
||||
begin
|
||||
// Draw Left and Top line :
|
||||
Pen.Color := TopLeftColor;
|
||||
|
||||
if DrawLeft
|
||||
then begin
|
||||
MoveTo(Left, Top + incValue);
|
||||
LineTo(Left, Bottom);
|
||||
end;
|
||||
|
||||
if DrawTop
|
||||
then begin
|
||||
MoveTo(Left + incValue, Top);
|
||||
LineTo(Right, Top);
|
||||
end;
|
||||
|
||||
// Draw right and bottom line :
|
||||
Pen.Color := BottomRightColor;
|
||||
|
||||
if DrawRight
|
||||
then begin
|
||||
MoveTo(Right, Top + incValue);
|
||||
LineTo(Right, Bottom);
|
||||
end;
|
||||
|
||||
if DrawBottom
|
||||
then begin
|
||||
MoveTo(Right - incValue, Bottom);
|
||||
LineTo(Left-1 + incValue, Bottom);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
begin
|
||||
if RoundRect
|
||||
then incValue := 1
|
||||
else incValue := 0;
|
||||
|
||||
Canvas.Pen.Width := 1;
|
||||
Dec(Rect.Bottom);
|
||||
Dec(Rect.Right);
|
||||
|
||||
while Width > 0 do
|
||||
begin
|
||||
Dec(Width);
|
||||
DrawLines;
|
||||
incValue := 0;
|
||||
InflateRect(Rect, -1, -1);
|
||||
end;
|
||||
|
||||
Inc(Rect.Bottom);
|
||||
Inc(Rect.Right);
|
||||
end;
|
||||
|
||||
function PointInEllipse(const aPt: TPoint; const aRect: TRect): boolean;
|
||||
var
|
||||
CenterEllipseCoord: TPoint;
|
||||
EllipseWidth, EllipseHeight: Integer;
|
||||
begin
|
||||
CenterEllipseCoord := Point((aRect.Right + aRect.Left) div 2, (aRect.Bottom + aRect.Top) div 2);
|
||||
EllipseWidth := (aRect.Right - aRect.Left) div 2;
|
||||
EllipseHeight := (aRect.Bottom - aRect.Top) div 2;
|
||||
|
||||
RESULT := Sqr((aPt.x - CenterEllipseCoord.x)/EllipseWidth) + Sqr((aPt.y - CenterEllipseCoord.y)/EllipseHeight)
|
||||
<= 1;
|
||||
// = 0 On the center of ellipse
|
||||
// < 1 Inside the ellipse
|
||||
// = on the border of ellipse
|
||||
// > 1 Outside the ellipse
|
||||
end;
|
||||
|
||||
function PictureIsTransparentAtPos(aPicture: TPicture; aPoint: TPoint): boolean;
|
||||
begin
|
||||
RESULT := false; // TJPEGImage and others formats not handled ...
|
||||
if aPicture.Graphic = nil then Exit;
|
||||
if aPicture.Graphic.Empty then Exit;
|
||||
|
||||
if aPicture.Graphic is TBitmap
|
||||
then begin
|
||||
RESULT := aPicture.Bitmap.Canvas.Pixels[aPoint.X, aPoint.Y]
|
||||
= aPicture.Bitmap.Canvas.Pixels[0, aPicture.Bitmap.Height-1];
|
||||
end
|
||||
else
|
||||
if aPicture.Graphic is TIcon
|
||||
then
|
||||
RESULT := IconIsTransparentAtPos(aPicture.Icon, aPoint)
|
||||
end;
|
||||
|
||||
// 9999 New function for CodeTyphon
|
||||
function IconIsTransparentAtPos(aIcon: TIcon; aPoint: TPoint): boolean;
|
||||
var aPic: TPicture;
|
||||
begin
|
||||
RESULT := false;
|
||||
aPic := TPicture.Create;
|
||||
|
||||
try
|
||||
aPic.Bitmap.Width := aIcon.Width;
|
||||
aPic.Bitmap.Height := aIcon.Height;
|
||||
aPic.Bitmap.PixelFormat := pf1bit; // Black = not transparent
|
||||
aPic.Bitmap.Canvas.Brush.Color := clWhite;
|
||||
aPic.Bitmap.Canvas.FillRect(Rect(0, 0, aIcon.Width, aIcon.Height));
|
||||
|
||||
aPic.Assign(aIcon);
|
||||
|
||||
aPic.Bitmap.PixelFormat := pf1bit; // Black = not transparent
|
||||
|
||||
RESULT := aPic.Bitmap.Canvas.Pixels[aPoint.X, aPoint.Y] <> clBlack;
|
||||
|
||||
finally
|
||||
aPic.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
function ValidGraphic(aGraphic: TGraphic): Boolean;
|
||||
begin
|
||||
RESULT := false;
|
||||
if aGraphic <> Nil
|
||||
then
|
||||
if not aGraphic.Empty
|
||||
then RESULT := true;
|
||||
end;
|
||||
|
||||
end.
|
||||
|
86
components/industrialstuff/source/indcyTypes.pas
Normal file
@ -0,0 +1,86 @@
|
||||
{ Unit indcyTypes from cyTypes
|
||||
|
||||
Description:
|
||||
Unit with Types declarations.
|
||||
|
||||
* ***** BEGIN LICENSE BLOCK *****
|
||||
*
|
||||
* Version: MPL 1.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
||||
* the specific language governing rights and limitations under the License.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Mauricio
|
||||
* (https://sourceforge.net/projects/tcycomponents/).
|
||||
*
|
||||
* No contributors for now ...
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or the
|
||||
* GNU Lesser General Public License Version 2.1 or later (the "LGPL"), in which
|
||||
* case the provisions of the GPL or the LGPL are applicable instead of those
|
||||
* above. If you wish to allow use of your version of this file only under the
|
||||
* terms of either the GPL or the LGPL, and not to allow others to use your
|
||||
* version of this file under the terms of the MPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice and other
|
||||
* provisions required by the LGPL or the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file under the
|
||||
* terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK *****}
|
||||
|
||||
unit indcyTypes;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
LCLIntf, LCLType, Graphics, Classes, types;
|
||||
|
||||
type
|
||||
// Graphic:
|
||||
TCaptionRender = (crNormal, crPathEllipsis, crEndEllipsis, crWordEllipsis);
|
||||
TCaptionOrientation = (coHorizontal, coHorizontalReversed, coVertical, coVerticalReversed);
|
||||
|
||||
TBgPosition = (bgCentered, bgTopLeft, bgTopCenter, bgTopRight, bgCenterRight, bgBottomRight, bgBottomCenter, bgBottomLeft, bgCenterLeft);
|
||||
TBgStyle = (bgNone, bgNormal, bgMosaic, bgStretch, bgStretchProportional);
|
||||
|
||||
TcyBevelCut = (bcLowered, bcRaised, bcNone, bcTransparent);
|
||||
|
||||
TDgradOrientation = (dgdVertical, dgdHorizontal, dgdAngle, dgdRadial, dgdRectangle);
|
||||
TDgradOrientationShape = (osRadial, osRectangle);
|
||||
TDgradBalanceMode = (bmNormal, bmMirror, bmReverse, bmReverseFromColor, bmInvertReverse, bmInvertReverseFromColor);
|
||||
|
||||
// Cindy components:
|
||||
TRunTimeDesignJob = (rjNothing, rjMove, rjResizeTop, rjResizeBottom, rjResizeLeft, rjResizeTopLeft,
|
||||
rjResizeBottomLeft, rjResizeRight, rjResizeTopRight, rjResizeBottomRight);
|
||||
|
||||
TLineCoord = record
|
||||
BottomCoord, TopCoord: TPoint;
|
||||
end;
|
||||
|
||||
//var
|
||||
// CaptionOrientationWarning: Boolean = true;
|
||||
|
||||
const
|
||||
DT_PATH_ELLIPSIS = $8000;
|
||||
DT_WORD_ELLIPSIS = $8000;
|
||||
|
||||
cCaptionOrientationWarning = 'Note that text orientation doesn''t work with all fonts!';
|
||||
|
||||
Alignments: array[TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER);
|
||||
WordWraps: array[Boolean] of Word = (DT_SINGLELINE, DT_WORDBREAK);
|
||||
TextLayouts: array[TTextLayout] of Longint = (DT_TOP, DT_VCENTER, DT_BOTTOM);
|
||||
CaptionOrientations: array[TCaptionOrientation] of word = (0, 1800, 900, 2700);
|
||||
CaptionRenders: array[TCaptionRender] of Integer = (0, DT_PATH_ELLIPSIS, DT_END_ELLIPSIS, DT_WORD_ELLIPSIS);
|
||||
|
||||
implementation
|
||||
|
||||
|
||||
end.
|
457
components/industrialstuff/source/indgnoumeter.pas
Normal file
@ -0,0 +1,457 @@
|
||||
{**********************************************************************
|
||||
GnouMeter is a meter which can display an integer or a float value (Single).
|
||||
Just like a progress bar or a gauge, all you have do do is to define
|
||||
the Minimum and maximum values as well as the actual value.
|
||||
|
||||
Above the meter, one can display the name of the data being measured (optional)
|
||||
and its actual value with its corresponding unit.
|
||||
The minimum and maximum values are respectively shown at the bottom and the
|
||||
top of the meter with their corresponding units.
|
||||
The meter is filled with the color ColorFore and its background color
|
||||
is defined by the ColorBack Property.
|
||||
|
||||
THIS COMPONENT IS ENTIRELY FREEWARE
|
||||
|
||||
Author: Jérôme Hersant
|
||||
jhersant@post4.tele.dk
|
||||
***********************************************************************}
|
||||
|
||||
unit indGnouMeter;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, Controls, Graphics, SysUtils, Messages, LMessages, Types, LCLType, LCLIntf;
|
||||
|
||||
type
|
||||
TindGnouMeter = class(TGraphicControl)
|
||||
private
|
||||
fValue: Double;
|
||||
fColorFore: TColor;
|
||||
fColorBack: TColor;
|
||||
fSignalUnit: ShortString;
|
||||
fValueMax: Double;
|
||||
fValueMin: Double;
|
||||
fDigits: Byte;
|
||||
fIncrement: Double;
|
||||
fShowIncrements: Boolean;
|
||||
fGapTop: Word;
|
||||
fGapBottom: Word;
|
||||
fBarThickness: Word;
|
||||
fMarkerColor: TColor;
|
||||
fShowMarker: Boolean;
|
||||
//Variables used internally
|
||||
TopTextHeight: Word;
|
||||
LeftMeter: Word;
|
||||
DisplayValue: String;
|
||||
DrawStyle: integer;
|
||||
TheRect: TRect;
|
||||
//End of variables used internally
|
||||
procedure SetValue(val: Double);
|
||||
procedure SetColorBack(val: TColor);
|
||||
procedure SetColorFore(val: TColor);
|
||||
procedure SetSignalUnit(val: ShortString);
|
||||
procedure SetValueMin(val: Double);
|
||||
procedure SetValueMax(val: Double);
|
||||
procedure SetDigits(val: Byte);
|
||||
procedure SetTransparent(val: Boolean);
|
||||
function GetTransparent: Boolean;
|
||||
procedure SetIncrement(val: Double);
|
||||
procedure SetShowIncrements(val: Boolean);
|
||||
procedure SetGapTop(val: Word);
|
||||
procedure SetGapBottom(val: Word);
|
||||
procedure SetBarThickness(val: Word);
|
||||
procedure SetMarkerColor(val: TColor);
|
||||
procedure SetShowMarker(val: Boolean);
|
||||
procedure DrawTopText;
|
||||
procedure DrawMeterBar;
|
||||
procedure DrawIncrements;
|
||||
function ValueToPixels(val: Double): integer;
|
||||
procedure DrawValueMax;
|
||||
procedure DrawValueMin;
|
||||
procedure DrawMarker;
|
||||
protected
|
||||
procedure Paint; override;
|
||||
procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
|
||||
public
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
destructor Destroy; override;
|
||||
published
|
||||
property Align;
|
||||
property Caption;
|
||||
property Visible;
|
||||
property ShowHint;
|
||||
property Value: Double read fValue write SetValue;
|
||||
property Color;
|
||||
property Font;
|
||||
property ParentColor;
|
||||
property ColorFore: Tcolor read fColorFore write SetColorFore;
|
||||
property ColorBack: Tcolor read fColorBack write SetColorBack;
|
||||
property SignalUnit: ShortString read fSignalUnit write SetSignalUnit;
|
||||
property ValueMin: Double read fValueMin write SetValueMin;
|
||||
property ValueMax: Double read fValueMax write SetValueMax;
|
||||
property Digits: Byte read fDigits write SetDigits;
|
||||
property Increment: Double read fIncrement write SetIncrement;
|
||||
property ShowIncrements: Boolean read fShowIncrements write SetShowIncrements;
|
||||
property Transparent: Boolean read GetTransparent write SetTransparent;
|
||||
property GapTop: Word read fGapTop write SetGapTop;
|
||||
property GapBottom: Word read fGapBottom write SetGapBottom;
|
||||
property BarThickness: Word read fBarThickness write SetBarThickness;
|
||||
property MarkerColor: TColor read fMarkerColor write SetMarkerColor;
|
||||
property ShowMarker: Boolean read fShowMarker write SetShowMarker;
|
||||
end;
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
constructor TindGnouMeter.Create(AOwner: TComponent);
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
ControlStyle := ControlStyle + [csReplicatable, csSetCaption];
|
||||
Width := 100;
|
||||
Height := 200;
|
||||
fColorFore := clRed;
|
||||
fColorBack := clBtnFace;
|
||||
fMarkerColor := clBlue;
|
||||
fValueMin := 0;
|
||||
fValueMax := 100;
|
||||
fIncrement := 10;
|
||||
fShowIncrements := True;
|
||||
fShowMarker := True;
|
||||
fValue := 0;
|
||||
fGapTop := 20;
|
||||
fGapBottom := 10;
|
||||
fBarThickness := 5;
|
||||
fSignalUnit := 'Units';
|
||||
end;
|
||||
|
||||
destructor TindGnouMeter.Destroy;
|
||||
begin
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.CMTextChanged(var Message: TMessage);
|
||||
begin
|
||||
Invalidate;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.SetValue(val: Double);
|
||||
begin
|
||||
if (val <> fValue) and (val >= fValueMin) and (val <= fValueMax) then
|
||||
begin
|
||||
fValue := val;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.SetColorFore(val: TColor);
|
||||
begin
|
||||
if val <> fColorFore then
|
||||
begin
|
||||
fColorFore := val;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.SetColorBack(val: TColor);
|
||||
begin
|
||||
if val <> fColorBack then
|
||||
begin
|
||||
fColorBack := val;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.SetSignalUnit(val: ShortString);
|
||||
begin
|
||||
if val <> fSignalUnit then
|
||||
begin
|
||||
fSignalUnit := val;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.SetValueMin(val: Double);
|
||||
begin
|
||||
if (val <> fValueMin) and (val <= fValue) then
|
||||
begin
|
||||
fValueMin := val;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.SetValueMax(val: Double);
|
||||
begin
|
||||
if (val <> fValueMax) and (val >= fValue) then
|
||||
begin
|
||||
fValueMax := val;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.SetDigits(val: Byte);
|
||||
begin
|
||||
if (val <> fDigits) then
|
||||
begin
|
||||
fDigits := val;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.SetIncrement(val: Double);
|
||||
begin
|
||||
if (val <> fIncrement) and (val > 0) then
|
||||
begin
|
||||
fIncrement := val;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.SetShowIncrements(val: Boolean);
|
||||
begin
|
||||
if (val <> fShowIncrements) then
|
||||
begin
|
||||
fShowIncrements := val;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TindGnouMeter.GetTransparent: Boolean;
|
||||
begin
|
||||
Result := not (csOpaque in ControlStyle);
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.SetTransparent(Val: Boolean);
|
||||
begin
|
||||
if Val <> Transparent then
|
||||
begin
|
||||
if Val then
|
||||
ControlStyle := ControlStyle - [csOpaque]
|
||||
else
|
||||
ControlStyle := ControlStyle + [csOpaque];
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.SetGapTop(val: Word);
|
||||
begin
|
||||
if (val <> fGapTop) then
|
||||
begin
|
||||
fGapTop := val;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.SetGapBottom(val: Word);
|
||||
begin
|
||||
if (val <> fGapBottom) then
|
||||
begin
|
||||
fGapBottom := val;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.SetBarThickness(val: Word);
|
||||
begin
|
||||
if (val <> fBarThickness) and (val > 0) then
|
||||
begin
|
||||
fBarThickness := val;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.SetMarkerColor(val: TColor);
|
||||
begin
|
||||
if (val <> fMarkerColor) then
|
||||
begin
|
||||
fMarkerColor := val;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.SetShowMarker(val: Boolean);
|
||||
begin
|
||||
if (val <> fShowMarker) then
|
||||
begin
|
||||
fShowMarker := val;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.DrawIncrements;
|
||||
var
|
||||
i: Double;
|
||||
PosPixels: Word;
|
||||
begin
|
||||
if fShowIncrements then
|
||||
begin
|
||||
with Canvas do
|
||||
begin
|
||||
i := fValueMin;
|
||||
while i <= fValueMax do
|
||||
begin
|
||||
PosPixels := ValueToPixels(i);
|
||||
pen.color := clGray;
|
||||
MoveTo(LeftMeter + BarThickness + 3, PosPixels - 1);
|
||||
LineTo(LeftMeter + BarThickness + 7, PosPixels - 1);
|
||||
pen.color := clWhite;
|
||||
MoveTo(LeftMeter + BarThickness + 3, PosPixels);
|
||||
LineTo(LeftMeter + BarThickness + 7, PosPixels);
|
||||
i := i + fIncrement;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.DrawMarker;
|
||||
begin
|
||||
if fShowMarker then
|
||||
begin
|
||||
with Canvas do
|
||||
begin
|
||||
pen.color := clWhite;
|
||||
Brush.Style := bsClear;
|
||||
MoveTo(LeftMeter - 2, ValueToPixels(fValue));
|
||||
LineTo(LeftMeter - 6, ValueToPixels(fValue) - 4);
|
||||
LineTo(LeftMeter - 6, ValueToPixels(fValue) + 4);
|
||||
pen.color := clGray;
|
||||
LineTo(LeftMeter - 2, ValueToPixels(fValue));
|
||||
|
||||
pen.color := fMarkerColor;
|
||||
Brush.color := fMarkerColor;
|
||||
Brush.Style := bsSolid;
|
||||
Polygon([Point(LeftMeter - 3, ValueToPixels(fValue)),
|
||||
Point(LeftMeter - 5, ValueToPixels(fValue) - 2),
|
||||
Point(LeftMeter - 5, ValueToPixels(fValue) + 2),
|
||||
Point(LeftMeter - 3, ValueToPixels(fValue))]);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.DrawTopText;
|
||||
begin
|
||||
with Canvas do
|
||||
begin
|
||||
DisplayValue := Caption;
|
||||
Brush.Style := bsClear;
|
||||
TheRect := ClientRect;
|
||||
DrawStyle := DT_SINGLELINE + DT_NOPREFIX + DT_CENTER + DT_TOP;
|
||||
Font.Style := [fsBold];
|
||||
TopTextHeight := DrawText(Handle, PChar(DisplayValue),
|
||||
Length(DisplayValue), TheRect, DrawStyle);
|
||||
|
||||
Font.Style := [];
|
||||
TheRect.Top := TopTextHeight;
|
||||
DisplayValue := FloatToStrF(Value, ffFixed, 8, fDigits) + ' ' + fSignalUnit;
|
||||
TopTextHeight := TopTextHeight + DrawText(Handle, PChar(DisplayValue),
|
||||
Length(DisplayValue), TheRect, DrawStyle);
|
||||
TopTextHeight := TopTextHeight + fGapTop;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.DrawValueMin;
|
||||
begin
|
||||
with Canvas do
|
||||
begin
|
||||
TheRect := ClientRect;
|
||||
TheRect.Left := LeftMeter + BarThickness + 10;
|
||||
TheRect.Top := TopTextHeight;
|
||||
TheRect.Bottom := Height - fGapBottom + 6;
|
||||
Brush.Style := bsClear;
|
||||
DrawStyle := DT_SINGLELINE + DT_NOPREFIX + DT_LEFT + DT_BOTTOM;
|
||||
DisplayValue := FloatToStrF(ValueMin, ffFixed, 8, fDigits) + ' ' + fSignalUnit;
|
||||
DrawText(Handle, PChar(DisplayValue), Length(DisplayValue),
|
||||
TheRect, DrawStyle);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.DrawValueMax;
|
||||
begin
|
||||
with Canvas do
|
||||
begin
|
||||
TheRect := ClientRect;
|
||||
TheRect.Left := LeftMeter + BarThickness + 10;
|
||||
TheRect.Top := TopTextHeight - 6;
|
||||
Brush.Style := bsClear;
|
||||
DrawStyle := DT_SINGLELINE + DT_NOPREFIX + DT_LEFT + DT_TOP;
|
||||
DisplayValue := FloatToStrF(ValueMax, ffFixed, 8, fDigits) + ' ' + fSignalUnit;
|
||||
DrawText(Handle, PChar(DisplayValue), Length(DisplayValue),
|
||||
TheRect, DrawStyle);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.DrawMeterBar;
|
||||
begin
|
||||
with Canvas do
|
||||
begin
|
||||
pen.Color := fColorBack;
|
||||
Brush.Color := fColorBack;
|
||||
Brush.Style := bsSolid;
|
||||
Rectangle(LeftMeter, ValueToPixels(fValueMax), LeftMeter +
|
||||
fBarThickness, ValueToPixels(fValueMin));
|
||||
|
||||
pen.Color := fColorFore;
|
||||
Brush.Color := fColorFore;
|
||||
Brush.Style := bsSolid;
|
||||
Rectangle(LeftMeter + 1, ValueToPixels(fValue), LeftMeter +
|
||||
fBarThickness, ValueToPixels(fValueMin));
|
||||
|
||||
pen.color := clWhite;
|
||||
Brush.Style := bsClear;
|
||||
MoveTo(LeftMeter + fBarThickness - 1, ValueToPixels(fValueMax));
|
||||
LineTo(LeftMeter, ValueToPixels(fValueMax));
|
||||
LineTo(LeftMeter, ValueToPixels(fValueMin) - 1);
|
||||
|
||||
pen.color := clGray;
|
||||
LineTo(LeftMeter + fBarThickness, ValueToPixels(fValueMin) - 1);
|
||||
LineTo(LeftMeter + fBarThickness, ValueToPixels(fValueMax));
|
||||
|
||||
if (fValue > fValueMin) and (fValue < fValueMax) then
|
||||
begin
|
||||
pen.color := clWhite;
|
||||
MoveTo(LeftMeter + 1, ValueToPixels(fValue));
|
||||
LineTo(LeftMeter + fBarThickness, ValueToPixels(fValue));
|
||||
pen.color := clGray;
|
||||
MoveTo(LeftMeter + 1, ValueToPixels(fValue) - 1);
|
||||
LineTo(LeftMeter + fBarThickness, ValueToPixels(fValue) - 1);
|
||||
end;
|
||||
|
||||
end;
|
||||
end;
|
||||
|
||||
function TindGnouMeter.ValueToPixels(val: Double): integer;
|
||||
var
|
||||
factor: Double;
|
||||
begin
|
||||
Result := 0;
|
||||
if fValueMax > fValueMin then
|
||||
begin
|
||||
Factor := (Height - fGapBottom - TopTextHeight) / (fValueMin - fValueMax);
|
||||
Result := Round(Factor * val - Factor * fValueMax + TopTextHeight);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TindGnouMeter.Paint;
|
||||
begin
|
||||
LeftMeter := (Width div 2) - 10 - fBarThickness;
|
||||
with Canvas do
|
||||
begin
|
||||
if not Transparent then
|
||||
begin
|
||||
Brush.Color := Self.Color;
|
||||
Brush.Style := bsSolid;
|
||||
FillRect(ClientRect);
|
||||
end;
|
||||
Brush.Style := bsClear;
|
||||
DrawTopText;
|
||||
DrawValueMin;
|
||||
DrawValueMax;
|
||||
DrawMeterBar;
|
||||
DrawMarker;
|
||||
DrawIncrements;
|
||||
end;
|
||||
end;
|
||||
|
||||
end.
|
371
components/industrialstuff/source/indled.pas
Normal file
@ -0,0 +1,371 @@
|
||||
{ Component(s):
|
||||
TindLed ---> old cindy name tcyled
|
||||
|
||||
Description:
|
||||
A simple led with Group feature
|
||||
depending on the state: ON/OFF/DISABLE
|
||||
|
||||
|
||||
* ***** BEGIN LICENSE BLOCK *****
|
||||
*
|
||||
* Version: MPL 1.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
||||
* the specific language governing rights and limitations under the License.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Mauricio
|
||||
* (https://sourceforge.net/projects/tcycomponents/).
|
||||
*
|
||||
* No contributors for now ...
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or the
|
||||
* GNU Lesser General Public License Version 2.1 or later (the "LGPL"), in which
|
||||
* case the provisions of the GPL or the LGPL are applicable instead of those
|
||||
* above. If you wish to allow use of your version of this file only under the
|
||||
* terms of either the GPL or the LGPL, and not to allow others to use your
|
||||
* version of this file under the terms of the MPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice and other
|
||||
* provisions required by the LGPL or the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file under the
|
||||
* terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK *****
|
||||
|
||||
Modified by Jurassic Pork 2013 for package Industrial of Lazarus}
|
||||
|
||||
unit IndLed;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses Classes, Types, Controls, Graphics, indcyBaseLed, indcyTypes, indcyClasses, indcyGraphics;
|
||||
|
||||
type
|
||||
TShapeType = (stRectangle, stRoundRect, stEllipse);
|
||||
|
||||
TcyCustomLed = class(TcyBaseLed)
|
||||
private
|
||||
FLedColorOn: TColor;
|
||||
FLedColorOff: TColor;
|
||||
FLedColorDisabled: TColor;
|
||||
FShapeRoundRectX: Integer;
|
||||
FShapeRoundRectY: Integer;
|
||||
FShapeLedColorOn: TColor;
|
||||
FShapeLedColorOff: TColor;
|
||||
FShapeLedColorDisabled: TColor;
|
||||
FBevels: TcyBevels;
|
||||
FShapeType: TShapeType;
|
||||
FShapePenWidth: Word;
|
||||
FTransparent: boolean;
|
||||
procedure SetShapeLedColorOn(Value: TColor);
|
||||
procedure SetShapePenWidth(Value: Word);
|
||||
procedure SetShapeType(Value: TShapeType);
|
||||
procedure SetShapeRoundRectX(Value: Integer);
|
||||
procedure SetShapeRoundRectY(Value: Integer);
|
||||
procedure SetBevels(const Value: TcyBevels);
|
||||
procedure SetLedColorDisabled(Value: TColor);
|
||||
procedure SetLedColorOff(Value: TColor);
|
||||
procedure SetLedColorOn(Value: TColor);
|
||||
procedure SetTransparent(const Value: boolean);
|
||||
procedure SetShapeLedColorDisabled(const Value: TColor);
|
||||
procedure SetShapeLedColorOff(const Value: TColor);
|
||||
protected
|
||||
procedure Paint; override;
|
||||
function TransparentColorAtPos(Point: TPoint): boolean; override;
|
||||
property Transparent: boolean read FTransparent write SetTransparent default false;
|
||||
property LedColorOn: TColor read FLedColorOn write SetLedColorOn;
|
||||
property LedColorOff: TColor read FLedColorOff write SetLedColorOff;
|
||||
property LedColorDisabled: TColor read FLedColorDisabled write SetLedColorDisabled;
|
||||
property ShapeLedColorOn: TColor read FShapeLedColorOn write SetShapeLedColorOn;
|
||||
property ShapeLedColorOff: TColor read FShapeLedColorOff write SetShapeLedColorOff;
|
||||
property ShapeLedColorDisabled: TColor read FShapeLedColorDisabled write SetShapeLedColorDisabled;
|
||||
property ShapePenWidth: Word read FShapePenWidth write SetShapePenWidth default 1;
|
||||
property ShapeType: TShapeType read FShapeType write SetShapeType default stRectangle;
|
||||
property ShapeRoundRectX: Integer read FShapeRoundRectX write SetShapeRoundRectX default 10;
|
||||
property ShapeRoundRectY: Integer read FShapeRoundRectY write SetShapeRoundRectY default 10;
|
||||
property Bevels: TcyBevels read FBevels write SetBevels;
|
||||
property Height default 25;
|
||||
property Width default 25;
|
||||
public
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
destructor Destroy; override;
|
||||
published
|
||||
end;
|
||||
|
||||
TindLed = class(TcyCustomLed)
|
||||
private
|
||||
protected
|
||||
public
|
||||
published
|
||||
property Align;
|
||||
property Anchors;
|
||||
property Color;
|
||||
property Constraints;
|
||||
property Enabled;
|
||||
property Visible;
|
||||
property OnClick;
|
||||
property OnMouseDown;
|
||||
property OnMouseMove;
|
||||
property OnMouseUp;
|
||||
property ShowHint;
|
||||
// Herited from TcyBaseLed :
|
||||
property AllowAllOff;
|
||||
property GroupIndex;
|
||||
property LedValue;
|
||||
property ReadOnly;
|
||||
// Herited from TcyCustomLed :
|
||||
property Bevels;
|
||||
property LedColorOn;
|
||||
property LedColorOff;
|
||||
property LedColorDisabled;
|
||||
property ShapeLedColorOn;
|
||||
property ShapeLedColorOff;
|
||||
property ShapeLedColorDisabled;
|
||||
property ShapePenWidth;
|
||||
property ShapeType;
|
||||
property ShapeRoundRectX;
|
||||
property ShapeRoundRectY;
|
||||
property Transparent;
|
||||
end;
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
constructor TcyCustomLed.Create(AOwner: TComponent);
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
FBevels := TcyBevels.Create(self, TcyBevel);
|
||||
|
||||
// Determine at design time if
|
||||
// the form is loading or if we have just added the component at design time :
|
||||
if csDesigning in ComponentState
|
||||
then
|
||||
if Owner <> nil
|
||||
then
|
||||
if not (csLoading in Owner.ComponentState) // we have just added the component at design time
|
||||
then begin
|
||||
with FBevels.Add do // Frame
|
||||
begin
|
||||
HighlightColor := clBlack;
|
||||
ShadowColor := clBlack;
|
||||
end;
|
||||
|
||||
with FBevels.Add do // Inner 3D frame
|
||||
Width := 3;
|
||||
|
||||
with FBevels.Add do // Contrast Frame
|
||||
Style := bcLowered;
|
||||
|
||||
with FBevels.Add do // Border between Bevels and Shape
|
||||
begin
|
||||
HighlightColor := clBlack;
|
||||
ShadowColor := clBlack;
|
||||
Width := 1;
|
||||
end;
|
||||
end;
|
||||
|
||||
FTransparent := false;
|
||||
FShapeType := stRectangle;
|
||||
FShapePenWidth:= 1;
|
||||
FShapeRoundRectX := 10;
|
||||
FShapeRoundRectY := 10;
|
||||
FShapeLedColorOn := clGreen;
|
||||
FShapeLedColorOff := $00004000; // Dark green
|
||||
FShapeLedColorDisabled := $00003468; // Dark maroon
|
||||
FLedColorOn:= clLime;
|
||||
FLedColorOff:= clGreen;
|
||||
FLedColorDisabled:= $000059B3; // Maroon
|
||||
Height := 25;
|
||||
Width := 25;
|
||||
end;
|
||||
|
||||
destructor TcyCustomLed.Destroy;
|
||||
begin
|
||||
FBevels.Free;
|
||||
FBevels := Nil;
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
procedure TcyCustomLed.Paint;
|
||||
var
|
||||
Rect: TRect;
|
||||
begin
|
||||
Rect := ClientRect;
|
||||
// Draw background :
|
||||
if not FTransparent
|
||||
then begin
|
||||
Canvas.Brush.Color := Color;
|
||||
Canvas.FillRect(Rect);
|
||||
end;
|
||||
|
||||
Bevels.DrawBevels(Canvas, Rect, false);
|
||||
|
||||
case ledStatus of
|
||||
lsOn: Canvas.Brush.Color := FLedColorOn;
|
||||
lsOff: Canvas.Brush.Color := FLedColorOff;
|
||||
lsDisabled: Canvas.Brush.Color := FLedColorDisabled;
|
||||
end;
|
||||
|
||||
if FShapePenWidth > 0
|
||||
then begin
|
||||
Rect := classes.Rect(Rect.Left + FShapePenWidth div 2,
|
||||
Rect.Top + FShapePenWidth div 2,
|
||||
Rect.Right - (FShapePenWidth-1) div 2,
|
||||
Rect.Bottom - (FShapePenWidth-1) div 2);
|
||||
|
||||
case ledStatus of
|
||||
lsOn: Canvas.Pen.Color := FShapeLedColorOn;
|
||||
lsOff: Canvas.Pen.Color := FShapeLedColorOff;
|
||||
lsDisabled: Canvas.Pen.Color := FShapeLedColorDisabled;
|
||||
end;
|
||||
|
||||
Canvas.Pen.Width := FShapePenWidth;
|
||||
end
|
||||
else begin
|
||||
Canvas.Pen.Color := Canvas.Brush.Color;
|
||||
Canvas.Pen.Width := 1;
|
||||
end;
|
||||
|
||||
case FShapeType of
|
||||
stRectangle: canvas.Rectangle(Rect);
|
||||
stRoundRect: canvas.RoundRect(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom, ShapeRoundRectX, ShapeRoundRectY);
|
||||
stEllipse : canvas.Ellipse(Rect);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TcyCustomLed.TransparentColorAtPos(Point: TPoint): boolean;
|
||||
begin
|
||||
RESULT := false;
|
||||
|
||||
if FTransparent and (Bevels.Count = 0) and (FShapeType = stEllipse)
|
||||
then RESULT := not PointInEllipse(Point, ClientRect);
|
||||
end;
|
||||
|
||||
procedure TcyCustomLed.SetTransparent(const Value: boolean);
|
||||
begin
|
||||
if value <> FTransparent
|
||||
then begin
|
||||
FTransparent := Value;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TcyCustomLed.SetShapeLedColorOn(Value: TColor);
|
||||
begin
|
||||
if value <> FShapeLedColorOn
|
||||
then begin
|
||||
FShapeLedColorOn := Value;
|
||||
|
||||
if GetLedStatus = lsOn
|
||||
then Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TcyCustomLed.SetShapeLedColorOff(const Value: TColor);
|
||||
begin
|
||||
if value <> FShapeLedColorOff
|
||||
then begin
|
||||
FShapeLedColorOff := Value;
|
||||
|
||||
if GetLedStatus = lsOff
|
||||
then Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TcyCustomLed.SetShapeLedColorDisabled(const Value: TColor);
|
||||
begin
|
||||
if value <> FShapeLedColorDisabled
|
||||
then begin
|
||||
FShapeLedColorDisabled := Value;
|
||||
|
||||
if GetLedStatus = lsDisabled
|
||||
then Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TcyCustomLed.SetShapePenWidth(Value: Word);
|
||||
begin
|
||||
if value <> FShapePenWidth
|
||||
then begin
|
||||
FShapePenWidth := Value;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TcyCustomLed.SetShapeRoundRectX(Value: Integer);
|
||||
begin
|
||||
if Value <> FShapeRoundRectX
|
||||
then begin
|
||||
FShapeRoundRectX := value;
|
||||
|
||||
if FShapeType = stRoundRect
|
||||
then Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TcyCustomLed.SetShapeRoundRectY(Value: Integer);
|
||||
begin
|
||||
if Value <> FShapeRoundRectY
|
||||
then begin
|
||||
FShapeRoundRectY := value;
|
||||
|
||||
if FShapeType = stRoundRect
|
||||
then Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TcyCustomLed.SetShapeType(Value: TShapeType);
|
||||
begin
|
||||
if value <> FShapeType
|
||||
then begin
|
||||
FShapeType := Value;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TcyCustomLed.SetLedColorOn(Value: TColor);
|
||||
begin
|
||||
if value <> FLedColorOn
|
||||
then begin
|
||||
FLedColorOn := Value;
|
||||
|
||||
if GetLedStatus = lsOn
|
||||
then Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TcyCustomLed.SetLedColorOff(Value: TColor);
|
||||
begin
|
||||
if value <> FLedColorOff
|
||||
then begin
|
||||
FLedColorOff := Value;
|
||||
|
||||
if GetLedStatus = lsOff
|
||||
then Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TcyCustomLed.SetLedColorDisabled(Value: TColor);
|
||||
begin
|
||||
if value <> FLedColorDisabled
|
||||
then begin
|
||||
FLedColorDisabled := Value;
|
||||
|
||||
if GetLedStatus = lsDisabled
|
||||
then Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TcyCustomLed.SetBevels(const Value: TcyBevels);
|
||||
begin
|
||||
FBevels := Value;
|
||||
end;
|
||||
|
||||
end.
|
BIN
components/industrialstuff/source/industrial_icons.res
Normal file
BIN
components/industrialstuff/source/ledbuttons.res
Normal file
585
components/industrialstuff/source/lednumber.pas
Normal file
@ -0,0 +1,585 @@
|
||||
{*********************************************************}
|
||||
{* VPLEDLABEL.PAS 1.03 -> LEDNumber.PAS *}
|
||||
{*********************************************************}
|
||||
|
||||
{* ***** BEGIN LICENSE BLOCK ***** *}
|
||||
{* Version: MPL 1.1 *}
|
||||
{* *}
|
||||
{* The contents of this file are subject to the Mozilla Public License *}
|
||||
{* Version 1.1 (the "License"); you may not use this file except in *}
|
||||
{* compliance with the License. You may obtain a copy of the License at *}
|
||||
{* http://www.mozilla.org/MPL/ *}
|
||||
{* *}
|
||||
{* Software distributed under the License is distributed on an "AS IS" basis, *}
|
||||
{* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License *}
|
||||
{* for the specific language governing rights and limitations under the *}
|
||||
{* License. *}
|
||||
{* *}
|
||||
{* The Original Code is TurboPower Visual PlanIt *}
|
||||
{* *}
|
||||
{* The Initial Developer of the Original Code is TurboPower Software *}
|
||||
{* *}
|
||||
{* Portions created by TurboPower Software Inc. are Copyright (C) 2002 *}
|
||||
{* TurboPower Software Inc. All Rights Reserved. *}
|
||||
{* *}
|
||||
{* Contributor(s): *}
|
||||
{* Modified by Jurassic Pork for include in industrial Stuff Lazarus package *}
|
||||
{* 05/2013 *}
|
||||
{* ***** END LICENSE BLOCK ***** *}
|
||||
|
||||
unit LedNumber;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
LMessages, Classes, Controls, Graphics;
|
||||
|
||||
type
|
||||
TSegmentSize = 2..10;
|
||||
TLedNumberBorderStyle = (lnbNone, lnbSingle, lnbSunken, lnbRaised);
|
||||
|
||||
{ TCustomLEDNumber }
|
||||
|
||||
TCustomLEDNumber = class(TGraphicControl)
|
||||
private
|
||||
FBorderStyle: TLedNumberBorderStyle;
|
||||
FTransparent: boolean;
|
||||
procedure SetBorderStyle(AValue: TLedNumberBorderStyle);
|
||||
procedure SetTransparent(AValue: boolean);
|
||||
protected{private}
|
||||
FBgColor : TColor;
|
||||
FOffColor : TColor;
|
||||
FOnColor : TColor;
|
||||
FColumns : Integer;
|
||||
FRows : Integer;
|
||||
FSize : TSegmentSize;
|
||||
lbDrawBmp : TBitmap;
|
||||
procedure CMTextChanged(var Message: TLMessage); message CM_TEXTCHANGED;
|
||||
procedure Initialize(var Points: array of TPoint);
|
||||
function NewOffset(xOry: char; OldOffset: Integer): Integer;
|
||||
procedure ProcessCaption(Points: array of TPoint);
|
||||
procedure PaintSegment(Segment: Integer; TheColor: TColor;
|
||||
Points: array of TPoint; OffsetX, OffsetY: Integer);
|
||||
procedure ResizeControl(Row, Col, Size: Integer);
|
||||
function GetAbout: string;
|
||||
procedure SetAbout(const Value: string);
|
||||
procedure SetSize(Value: TSegmentSize);
|
||||
procedure SetOnColor(Value: TColor);
|
||||
procedure SetOffColor(Value: TColor);
|
||||
procedure SetRows(Value: Integer);
|
||||
procedure SetColumns(Value: Integer);
|
||||
procedure SetbgColor(Value: TColor);
|
||||
procedure SelectSegments(Segment: Word; Points: array of TPoint;
|
||||
OffsetX, OffsetY: Integer);
|
||||
protected
|
||||
procedure Paint; override;
|
||||
public
|
||||
constructor Create(AOwner:TComponent);override;
|
||||
destructor Destroy; override;
|
||||
{properties}
|
||||
property Version: string read GetAbout write SetAbout stored False;
|
||||
property BorderStyle: TLedNumberBorderStyle read FBorderStyle write SetBorderStyle default lnbNone; {Draws border around segments.}
|
||||
property Columns: Integer read FColumns write SetColumns default 10;
|
||||
property Rows: Integer read FRows write SetRows default 1;
|
||||
property BgColor: TColor read FbgColor write SetbgColor default clBlack;
|
||||
property OffColor: TColor read FOffColor write SetOffColor default $000E3432;
|
||||
property OnColor: TColor read FOnColor write SetOnColor default clLime;
|
||||
property Size: TSegmentSize read FSize write SetSize default 2;
|
||||
property Transparent: boolean read FTransparent write SetTransparent default false; {Draws segments with transparent background.BgColor is used as mask color.}
|
||||
{Inherited properties}
|
||||
property Caption;
|
||||
property OnClick;
|
||||
property OnDblClick;
|
||||
property OnDragDrop;
|
||||
property OnDragOver;
|
||||
property OnEndDrag;
|
||||
property OnMouseDown;
|
||||
property OnMouseMove;
|
||||
property OnMouseUp;
|
||||
property ParentShowHint;
|
||||
property PopupMenu;
|
||||
property ShowHint;
|
||||
property Visible;
|
||||
end;
|
||||
|
||||
TLEDNumber = class(TCustomLEDNumber)
|
||||
published
|
||||
property Version;
|
||||
property BorderStyle;
|
||||
property Caption;
|
||||
property Columns;
|
||||
property Rows;
|
||||
property OnClick;
|
||||
property OnDblClick;
|
||||
property OnDragDrop;
|
||||
property OnDragOver;
|
||||
property OnEndDrag;
|
||||
property OnMouseDown;
|
||||
property OnMouseMove;
|
||||
property OnMouseUp;
|
||||
property BgColor;
|
||||
property OffColor;
|
||||
property OnColor;
|
||||
property ParentShowHint;
|
||||
property PopupMenu;
|
||||
property Size;
|
||||
property ShowHint;
|
||||
property Transparent;
|
||||
property Visible;
|
||||
end;
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
|
||||
// uses
|
||||
// VpConst;
|
||||
|
||||
{ LED Segment Map }
|
||||
{ }
|
||||
{ ------------------------ }
|
||||
{ | 1 | }
|
||||
{ ------------------------ }
|
||||
{ | | \ | | / | | }
|
||||
{ | | \ | | / | | }
|
||||
{ | | \ | | / | | }
|
||||
{ |2 |\3 \ |4 | /5 /|6 | }
|
||||
{ | | \ \| |/ / | | }
|
||||
{ | | \ | | / | | }
|
||||
{ ----------- ----------- }
|
||||
{ | 7 \/ 8 | }
|
||||
{ -----------/\----------- }
|
||||
{ | | / | | \ | | }
|
||||
{ | | / /| |\ \ | | }
|
||||
{ |9 |/10 / |11| \12 \|13| }
|
||||
{ | | / | | \ | | }
|
||||
{ | | / | | \ | | }
|
||||
{ | | / | | \ | | }
|
||||
{ ------------------------ |-----| }
|
||||
{ | 14 | | * | }
|
||||
{ ------------------------ |-----| }
|
||||
{ }
|
||||
{ * Period and comma are drawn here }
|
||||
{ Colon is drawn in the center of }
|
||||
{ segments 4 and 11 }
|
||||
|
||||
{ Each segment is made up of 6 points. The segments that don't need 6 points, }
|
||||
{ such as the period and colon dots, return to the coordinates of the initial }
|
||||
{ point for the remaining unused points. }
|
||||
|
||||
const
|
||||
{LED SEGMENT ARRAYS}
|
||||
MAX_POINTS = 107;
|
||||
|
||||
DigitPoints: array[0..MAX_POINTS] of TPoint =
|
||||
{Segment 1}
|
||||
((X:2;Y:2),(X:3;Y:1),(X:11;Y:1),(X:12;Y:2),(X:11;Y:3),(X:3;Y:3),
|
||||
{Segment 2}
|
||||
(X:2;Y:3),(X:3;Y:4),(X:3;Y:12),(X:2;Y:13),(X:1;Y:12),(X:1;Y:4),
|
||||
{Segment 3}
|
||||
(X:3;Y:3),(X:6;Y:9),(X:6;Y:13),(X:3;Y:7),(X:3;Y:3),(X:3;Y:3),
|
||||
{Segment 4}
|
||||
(X:7;Y:3),(X:8;Y:4),(X:8;Y:12),(X:7;Y:13),(X:6;Y:12),(X:6;Y:4),
|
||||
{Segment 5}
|
||||
(X:11;Y:3),(X:11;Y:7),(X:8;Y:13),(X:8;Y:9),(X:11;Y:3),(X:11;Y:3),
|
||||
{Segment 6}
|
||||
(X:12;Y:3),(X:13;Y:4),(X:13;Y:12),(X:12;Y:13),(X:11;Y:12),(X:11;Y:4),
|
||||
{Segment 7}
|
||||
(X:2;Y:14),(X:3;Y:13),(X:6;Y:13),(X:7;Y:14),(X:6;Y:15),(X:3;Y:15),
|
||||
{Segment 8}
|
||||
(X:7;Y:14),(X:8;Y:13),(X:11;Y:13),(X:12;Y:14),(X:11;Y:15),(X:8;Y:15),
|
||||
{Segment 9}
|
||||
(X:2;Y:15),(X:3;Y:16),(X:3;Y:24),(X:2;Y:25),(X:1;Y:24),(X:1;Y:16),
|
||||
{Segment 10}
|
||||
(X:6;Y:15),(X:6;Y:19),(X:3;Y:25),(X:3;Y:21),(X:6;Y:15),(X:6;Y:15),
|
||||
{Segment 11}
|
||||
(X:7;Y:15),(X:8;Y:16),(X:8;Y:24),(X:7;Y:25),(X:6;Y:24),(X:6;Y:16),
|
||||
{Segment 12}
|
||||
(X:8;Y:15),(X:11;Y:21),(X:11;Y:25),(X:8;Y:19),(X:8;Y:15),(X:8;Y:15),
|
||||
{Segment 13}
|
||||
(X:12;Y:15),(X:13;Y:16),(X:13;Y:24),(X:12;Y:25),(X:11;Y:24),(X:11;Y:16),
|
||||
{Segment 14}
|
||||
(X:2;Y:26),(X:3;Y:25),(X:11;Y:25),(X:12;Y:26),(X:11;Y:27),(X:3;Y:27),
|
||||
{Period }
|
||||
(X:14;Y:25),(X:16;Y:25),(X:16;Y:27),(X:14;Y:27),(X:14;Y:25),(X:14;Y:25),
|
||||
{Comma }
|
||||
(X:14;Y:25),(X:16;Y:25),(X:16;Y:27),(X:13;Y:30),(X:14;Y:27),(X:14;Y:25),
|
||||
{Colon Top }
|
||||
(X:5;Y:7),(X:9;Y:7),(X:9;Y:10),(X:5;Y:10),(X:5;Y:7),(X:5;Y:7),
|
||||
{Colon Btm }
|
||||
(X:5;Y:20),(X:9;Y:20),(X:9;Y:23),(X:5;Y:23),(X:5;Y:20),(X:5;Y:20));
|
||||
|
||||
Characters: Array[0..72] of Word =
|
||||
($0000,$3B70,$1320,$0001,$0300,$0002,$0840,$CCCC,$1020,$8784,
|
||||
{ ' ' * + , - . / 0 1 2 }
|
||||
$870C,$4708,$C30C,$C38C,$8408,$C78C,$C70C,$0810,$2040,$C788,
|
||||
{ 3 4 5 6 7 8 9 < > A }
|
||||
$952C,$C084,$942C,$C384,$C380,$C18C,$4788,$9024,$048C,$4A90,
|
||||
{ B C D E F G H I J K }
|
||||
$4084,$6C88,$6498,$C48C,$C780,$C49E,$C790,$C214,$9020,$448C,
|
||||
{ L M N O P Q R S T U }
|
||||
$48C0,$44D8,$2850,$2820,$8844,$2010,$C788,$952C,$C084,$942C,
|
||||
{ V W X Y Z / a b c d }
|
||||
$C384,$C380,$C18C,$4788,$9024,$048C,$4A90,$4084,$6C88,$6498,
|
||||
{ e f g h i j k l m n }
|
||||
$C48C,$C780,$C49E,$C790,$C214,$9020,$448C,$48C0,$44D8,$2850,
|
||||
{ o p q r s t u v w x }
|
||||
$2820,$8844,$FFFF);
|
||||
{ y z : }
|
||||
|
||||
CharacterNDX: Array[1..122] of integer =
|
||||
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
|
||||
10, 11, 12, 13, 14, 15, 16, 72, 0, 17, 0, 18, 0, 0, 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, 0, 45, 0, 0, 0, 0, 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);
|
||||
|
||||
|
||||
{===== TCustomLEDNumber ============================================}
|
||||
|
||||
constructor TCustomLEDNumber.Create(AOwner:TComponent);
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
FTransparent := False;
|
||||
FBorderStyle := lnbNone;
|
||||
ControlStyle := [csCaptureMouse,
|
||||
csOpaque,
|
||||
csSetCaption,
|
||||
csClickEvents,
|
||||
csDoubleClicks];
|
||||
Width := 170;
|
||||
Height := 30;
|
||||
FOnColor := clLime;
|
||||
FOffColor := $000E3432;
|
||||
FBgColor := clBlack;
|
||||
FSize := 2;
|
||||
FRows := 1;
|
||||
FColumns := 10;
|
||||
Caption := 'LED-LABEL';
|
||||
lbDrawBmp := TBitmap.Create;
|
||||
end;
|
||||
{=====}
|
||||
|
||||
destructor TCustomLEDNumber.Destroy;
|
||||
begin
|
||||
lbDrawBmp.Free;
|
||||
lbDrawBmp := nil;
|
||||
inherited Destroy;
|
||||
end;
|
||||
{=====}
|
||||
|
||||
function TCustomLEDNumber.GetAbout : string;
|
||||
begin
|
||||
Result := ''; //VpVersionStr;
|
||||
end;
|
||||
{=====}
|
||||
|
||||
procedure TCustomLEDNumber.SetAbout(const Value : string);
|
||||
begin
|
||||
{Leave empty}
|
||||
end;
|
||||
{=====}
|
||||
|
||||
procedure TCustomLEDNumber.SetTransparent(AValue: boolean);
|
||||
begin
|
||||
if FTransparent=AValue then Exit;
|
||||
FTransparent:=AValue;
|
||||
lbDrawBmp.Transparent := FTransparent;
|
||||
lbDrawBmp.TransparentColor := FBgColor;
|
||||
Invalidate;
|
||||
end;
|
||||
|
||||
procedure TCustomLEDNumber.SetBorderStyle(AValue: TLedNumberBorderStyle);
|
||||
begin
|
||||
if FBorderStyle=AValue then Exit;
|
||||
FBorderStyle:=AValue;
|
||||
Invalidate;
|
||||
end;
|
||||
|
||||
procedure TCustomLEDNumber.CMTextChanged(var Message: TLMessage);
|
||||
begin
|
||||
inherited;
|
||||
Invalidate;
|
||||
end;
|
||||
{=====}
|
||||
|
||||
procedure TCustomLEDNumber.Initialize(var Points: array of TPoint);
|
||||
var
|
||||
I : Integer;
|
||||
begin
|
||||
for I := 0 to MAX_POINTS do begin
|
||||
Points[i].X := DigitPoints[i].X * (FSize - 1);
|
||||
Points[i].Y := DigitPoints[i].Y * (FSize - 1);
|
||||
end;
|
||||
end;
|
||||
{=====}
|
||||
|
||||
function TCustomLEDNumber.NewOffset(xOry: char; OldOffset: Integer): Integer;
|
||||
begin
|
||||
if (xOry = 'x')then
|
||||
newOffset := oldOffset + 17 * (FSize - 1)
|
||||
else
|
||||
newOffset := oldOffset + 30 * (FSize -1)
|
||||
end;
|
||||
{=====}
|
||||
|
||||
procedure TCustomLEDNumber.Paint;
|
||||
var
|
||||
Points: array[0..MAX_POINTS] of TPoint;
|
||||
ARect: TRect;
|
||||
begin
|
||||
lbDrawBMP.Width := Width;
|
||||
lbDrawBMP.Height := Height;
|
||||
|
||||
Initialize(Points);
|
||||
lbDrawBMP.Canvas.Brush.Color := FBgColor;
|
||||
lbDrawBMP.Canvas.FillRect(ClientRect);
|
||||
ProcessCaption(Points);
|
||||
|
||||
Canvas.CopyMode := cmSrcCopy;
|
||||
if BorderStyle <> lnbNone then
|
||||
begin
|
||||
ARect := ClientRect;
|
||||
case BorderStyle of
|
||||
lnbSingle:
|
||||
begin
|
||||
Canvas.Pen.Color := cl3DDkShadow;
|
||||
Canvas.Frame(ARect);
|
||||
end;
|
||||
lnbSunken: Canvas.Frame3D(ARect, cl3DDkShadow, clBtnHiLight, 1);
|
||||
lnbRaised: Canvas.Frame3D(ARect, clBtnHiLight, cl3DDkShadow, 1);
|
||||
end;
|
||||
inc(ARect.Left, 1);
|
||||
inc(ARect.Top, 1);
|
||||
inc(ARect.Right, 1);
|
||||
inc(ARect.Bottom, 1);
|
||||
Canvas.StretchDraw(ARect, lbDrawBMP);
|
||||
end else
|
||||
Canvas.Draw(0, 0, lbDrawBMP);
|
||||
end;
|
||||
{=====}
|
||||
|
||||
procedure TCustomLEDNumber.PaintSegment(Segment: Integer; TheColor: TColor;
|
||||
Points: array of TPoint; OffsetX, OffsetY: Integer);
|
||||
var
|
||||
I: Integer;
|
||||
DrawPts: array[0..5] of TPoint;
|
||||
begin
|
||||
Dec(Segment);
|
||||
lbDrawBMP.Canvas.Pen.Style := psClear;
|
||||
lbDrawBMP.Canvas.Brush.Color := TheColor;
|
||||
for i := 0 to 5 do begin
|
||||
DrawPts[i].X := offsetX + Points[Segment * 6 + i].X;
|
||||
DrawPts[i].Y := offsetY + Points[Segment * 6 + i].Y;
|
||||
end;
|
||||
lbDrawBMP.Canvas.Polygon(DrawPts);
|
||||
end;
|
||||
{=====}
|
||||
|
||||
procedure TCustomLEDNumber.SelectSegments(Segment: Word;
|
||||
Points: array of TPoint; OffsetX, OffsetY: Integer);
|
||||
var
|
||||
I : integer;
|
||||
Bit : word;
|
||||
MyColor : TColor;
|
||||
Skip : Boolean;
|
||||
begin
|
||||
if (Segment and $FFFF) = $FFFF then begin
|
||||
MyColor := FOnColor;
|
||||
PaintSegment(17, MyColor, Points, OffsetX, OffsetY);
|
||||
PaintSegment(18, MyColor, Points, OffsetX, OffsetY);
|
||||
end
|
||||
else begin
|
||||
Bit := $8000;
|
||||
for I := 1 to 16 do begin
|
||||
Skip := False;
|
||||
if (Segment and Bit) = Bit then
|
||||
MyColor := FOnColor
|
||||
else begin
|
||||
if (i = 15) or (i = 16) then
|
||||
Skip := True;
|
||||
MyColor := FOffColor;
|
||||
end;
|
||||
if (not Skip) and (MyColor <> FBgColor) then
|
||||
PaintSegment(I, MyColor, Points, OffsetX, OffsetY);
|
||||
Bit := Bit div 2;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
{=====}
|
||||
|
||||
procedure TCustomLEDNumber.ProcessCaption(Points: array of TPoint);
|
||||
var
|
||||
Next : Char;
|
||||
Last : Char;
|
||||
I, X : Integer;
|
||||
Row, ColsPerRow: Integer;
|
||||
Tmp : Integer;
|
||||
OffsetX : Integer;
|
||||
OffsetY : Integer;
|
||||
DisplayStr : string;
|
||||
begin
|
||||
Last := #0;
|
||||
OffsetX := FSize;
|
||||
OffsetY := 0;
|
||||
|
||||
DisplayStr := Caption;
|
||||
|
||||
if Length(DisplayStr) > 0 then
|
||||
if (DisplayStr[1] = ',') or (DisplayStr[1] = '.') then
|
||||
DisplayStr := ' ' + DisplayStr;
|
||||
|
||||
Row := 1;
|
||||
ColsPerRow := 0;
|
||||
for I := 1 to Length(Caption) do begin
|
||||
Next := Caption[I];
|
||||
case Ord(Next) of
|
||||
42..58,60,62,65..90,92,97..122: begin
|
||||
if ColsPerRow = FColumns then begin
|
||||
Row := Row + 1;
|
||||
if Row > FRows then
|
||||
exit;
|
||||
offsetY := newOffset('y',offsetY);
|
||||
offsetX := FSize;
|
||||
ColsPerRow := 0
|
||||
end;
|
||||
if (Next = '.') or (Next = ',') then
|
||||
if (Last = '.') or (Last = ',') then begin
|
||||
SelectSegments(Characters[CharacterNDX[Ord(Next)]], Points,
|
||||
OffsetX, OffsetY);
|
||||
OffsetX := NewOffset('x', OffsetX);
|
||||
end
|
||||
else begin
|
||||
OffsetX := OffsetX - (17 * (FSize - 1));
|
||||
Tmp := (Characters[CharacterNDX[Ord(Next)]]
|
||||
or Characters[CharacterNDX[Ord(Last)]]);
|
||||
SelectSegments(Tmp, Points, OffsetX, OffsetY);
|
||||
OffsetX := NewOffset('x', OffsetX);
|
||||
end
|
||||
else begin
|
||||
SelectSegments(Characters[CharacterNDX[Ord(Next)]], Points, OffsetX,
|
||||
OffsetY);
|
||||
offsetX := NewOffset('x', OffsetX);
|
||||
ColsPerRow := ColsPerRow + 1;
|
||||
end;
|
||||
end;
|
||||
10: begin {eat linefeed}
|
||||
end;
|
||||
13: begin
|
||||
if ColsPerRow < FColumns then
|
||||
for x := 1 to (FColumns - ColsPerRow) do begin
|
||||
SelectSegments(Characters[CharacterNDX[1]], Points, OffsetX, OffsetY);
|
||||
OffsetX := NewOffset('x', OffsetX);
|
||||
end;
|
||||
Row := Row + 1;
|
||||
if Row > FRows then
|
||||
exit;
|
||||
OffsetY := NewOffset('y', OffsetY);
|
||||
OffsetX := FSize;
|
||||
ColsPerRow := 0;
|
||||
end;
|
||||
else begin
|
||||
if ColsPerRow = FColumns then begin
|
||||
Row := Row + 1;
|
||||
if Row > FRows then
|
||||
Exit;
|
||||
OffsetY := NewOffset('y', OffsetY);
|
||||
OffsetX := FSize;
|
||||
ColsPerRow := 0;
|
||||
end;
|
||||
SelectSegments(Characters[CharacterNDX[1]], Points, OffsetX, OffsetY);
|
||||
OffsetX := newOffset('x', OffsetX);
|
||||
ColsPerRow := ColsPerRow + 1;
|
||||
end;
|
||||
end;
|
||||
Last := Next;
|
||||
end;
|
||||
for x := 1 to (FColumns - ColsPerRow) do begin
|
||||
SelectSegments(Characters[CharacterNDX[1]], Points, OffsetX, OffsetY);
|
||||
OffsetX := NewOffset('x', OffsetX);
|
||||
end;
|
||||
if (FColumns * FRows) > Length(caption) then begin
|
||||
for X := Row + 1 to FRows do begin
|
||||
OffsetX := FSize;
|
||||
OffsetY := NewOffset('y', OffsetY);
|
||||
for I := 1 to FColumns do begin
|
||||
SelectSegments(Characters[CharacterNDX[1]], Points, OffsetX, OffsetY);
|
||||
OffsetX := NewOffset('x', OffsetX);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
{=====}
|
||||
|
||||
procedure TCustomLEDNumber.ResizeControl(Row, Col, Size: Integer);
|
||||
begin
|
||||
FRows := Row;
|
||||
FColumns := Col;
|
||||
FSize := Size;
|
||||
SetBounds(Left, Top, FColumns * 17 * (FSize - 1), FRows * 30 * (FSize - 1));
|
||||
Invalidate;
|
||||
end;
|
||||
{=====}
|
||||
|
||||
procedure TCustomLEDNumber.SetbgColor(Value: TColor);
|
||||
begin
|
||||
if FBgColor <> Value then begin
|
||||
FBgColor := Value;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
{=====}
|
||||
|
||||
procedure TCustomLEDNumber.SetOnColor(Value:TColor);
|
||||
begin
|
||||
if FOnColor <> Value then begin
|
||||
FOnColor := Value;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
{=====}
|
||||
|
||||
procedure TCustomLEDNumber.SetOffColor(Value:TColor);
|
||||
begin
|
||||
if FOffColor <> Value then begin
|
||||
FOffColor := Value;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
{=====}
|
||||
|
||||
procedure TCustomLEDNumber.SetRows(Value : Integer);
|
||||
begin
|
||||
if FRows <> Value then begin
|
||||
if Value < 1 then
|
||||
Value := 1;
|
||||
ResizeControl(Value, FColumns, FSize);
|
||||
end;
|
||||
end;
|
||||
{=====}
|
||||
|
||||
procedure TCustomLEDNumber.SetColumns(Value : Integer);
|
||||
begin
|
||||
if FColumns <> Value then begin
|
||||
if Value < 1 then
|
||||
Value := 1;
|
||||
ResizeControl(FRows, Value, FSize);
|
||||
end;
|
||||
end;
|
||||
{=====}
|
||||
|
||||
procedure TCustomLEDNumber.SetSize(Value : TSegmentSize);
|
||||
begin
|
||||
if FSize <> Value then begin
|
||||
//if Value < 2 then <- unreachable
|
||||
// Value := 2;
|
||||
//if Value > 10 then
|
||||
// Value := 10;
|
||||
ResizeControl(FRows, FColumns, Value);
|
||||
end;
|
||||
end;
|
||||
{=====}
|
||||
end.
|
485
components/industrialstuff/source/sensors.pas
Normal file
@ -0,0 +1,485 @@
|
||||
{ Copyright (C) 1998-2000, written by Shkolnik Mike
|
||||
FIDOnet: 2:463/106.14
|
||||
E-Mail: mshkolnik@scalabium.com
|
||||
mshkolnik@yahoo.com
|
||||
WEB: http://www.scalabium.com
|
||||
http://www.geocities.com/mshkolnik
|
||||
tel: 380-/44/-552-10-29
|
||||
|
||||
TStopLightSensor and TAnalogSensor sensor components
|
||||
Modified by Jurassic Pork for Lazarus "Industrial" package
|
||||
}
|
||||
unit Sensors;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses LCLIntf, LCLType, LResources, Classes, Controls, Graphics, Stdctrls, Extctrls;
|
||||
|
||||
type
|
||||
TStopLights = (slUNKNOWN, slRED, slYELLOW, slGREEN);
|
||||
|
||||
type
|
||||
TSensorPanel = class(TPanel)
|
||||
private
|
||||
FlblShowText: TLabel; {sensor value}
|
||||
FShowText: Boolean;
|
||||
FShowLevel: Boolean; {show the RED and YELLOW levels or not}
|
||||
|
||||
FValue: Double;
|
||||
FValueMin: Double;
|
||||
FValueMax: Double;
|
||||
FValueRed: Double;
|
||||
FValueYellow: Double;
|
||||
|
||||
FColorBack: TColor;
|
||||
FColorFore: TColor;
|
||||
FColorRed: TColor;
|
||||
FColorYellow: TColor;
|
||||
|
||||
function GetCaption: TCaption;
|
||||
procedure SetCaption(AValue: TCaption);
|
||||
|
||||
procedure SetShowText(AValue: Boolean);
|
||||
procedure SetShowLevel(AValue: Boolean);
|
||||
|
||||
procedure SetColorInd(Index: Integer; AValue: TColor);
|
||||
|
||||
procedure SetValue(AValue: Double); virtual;
|
||||
procedure SetValueMin(AValue: Double);
|
||||
procedure SetValueMax(AValue: Double);
|
||||
procedure SetValueRed(AValue: Double);
|
||||
procedure SetValueYellow(AValue: Double);
|
||||
public
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
destructor Destroy; override;
|
||||
function GetStatus: TStopLights;
|
||||
procedure SetColorState(slStopLight: TStopLights); virtual;
|
||||
published
|
||||
property Caption read GetCaption write SetCaption;
|
||||
|
||||
property ShowText: Boolean read FShowText write SetShowText;
|
||||
property ShowLevel: Boolean read FShowLevel write SetShowLevel;
|
||||
|
||||
property ColorFore: TColor index 0 read FColorFore write SetColorInd default clLime;
|
||||
property ColorBack: TColor index 1 read FColorBack write SetColorInd default clBlack;
|
||||
property ColorRed: TColor index 2 read FColorRed write SetColorInd default clRed;
|
||||
property ColorYellow: TColor index 3 read FColorYellow write SetColorInd default clYellow;
|
||||
|
||||
property Value: Double read FValue write SetValue;
|
||||
property ValueMin: Double read FValueMin write SetValueMin;
|
||||
property ValueMax: Double read FValueMax write SetValueMax;
|
||||
property ValueRed: Double read FValueRed write SetValueRed;
|
||||
property ValueYellow: Double read FValueYellow write SetValueYellow;
|
||||
end;
|
||||
|
||||
TAnalogKind = (akAnalog, akHorizontal, akVertical);
|
||||
TAnalogSensor = class(TSensorPanel)
|
||||
private
|
||||
FAnalogKind: TAnalogKind;
|
||||
|
||||
procedure PaintAsNeedle;
|
||||
procedure PaintAsHorizontal;
|
||||
procedure PaintAsVertical;
|
||||
procedure SetAnalogKind(AValue: TAnalogKind);
|
||||
protected
|
||||
procedure Paint; override;
|
||||
public
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
published
|
||||
property Font;
|
||||
property AnalogKind: TAnalogKind read FAnalogKind write SetAnalogKind;
|
||||
end;
|
||||
|
||||
TStopLightSensor = class(TImage)
|
||||
private
|
||||
FState: TStopLights;
|
||||
procedure SetState(AValue: TStopLights);
|
||||
protected
|
||||
public
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
published
|
||||
property Center default True;
|
||||
property State: TStopLights read FState write SetState;
|
||||
end;
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
{$R sensors.res}
|
||||
|
||||
uses SysUtils;
|
||||
|
||||
{ TSensorPanel }
|
||||
|
||||
constructor TSensorPanel.Create(AOwner: TComponent);
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
|
||||
Height := 75;
|
||||
Width := 170;
|
||||
Parent := AOwner as TWinControl;
|
||||
|
||||
FValue := 0;
|
||||
|
||||
FValueMin := 0;
|
||||
FValueMax := 100;
|
||||
FValueRed := 30;
|
||||
FValueYellow := 60;
|
||||
|
||||
FColorFore := {clGreen} clLime;
|
||||
FColorBack := clBlack {clWhite};
|
||||
FColorRed := clRed;
|
||||
FColorYellow := clYellow;
|
||||
|
||||
FlblShowText := TLabel.Create(Self);
|
||||
with FlblShowText do
|
||||
begin
|
||||
Alignment := taCenter;
|
||||
AutoSize := False;
|
||||
Font := Self.Font;
|
||||
Height := 17;
|
||||
Left := 5;
|
||||
Top := 57;
|
||||
Width := 160;
|
||||
Parent := Self;
|
||||
Align := alBottom;
|
||||
end;
|
||||
|
||||
FShowLevel := True;
|
||||
Caption := '';
|
||||
ShowText := True;
|
||||
end;
|
||||
|
||||
destructor TSensorPanel.Destroy;
|
||||
begin
|
||||
// FlblShowText.Free;
|
||||
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
function TSensorPanel.GetStatus: TStopLights;
|
||||
begin
|
||||
Result := slUNKNOWN;
|
||||
if (Value > ValueMin) and (Value < ValueMin) then Result := slGREEN;
|
||||
if (Value < ValueYellow) then Result := slYellow;
|
||||
if (Value < ValueRed) then Result := slRED;
|
||||
end;
|
||||
|
||||
procedure TSensorPanel.SetColorState(slStopLight: TStopLights);
|
||||
begin
|
||||
FlblShowText.Font := Font;
|
||||
case slStopLight of
|
||||
slRED: FlblShowText.Font.Color := FColorRed;
|
||||
slYELLOW: FlblShowText.Font.Color := FColorYellow;
|
||||
else // slUNKNOWN, slGREEN
|
||||
// FlblShowText.Font := Font;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSensorPanel.SetValue(AValue: Double);
|
||||
begin
|
||||
if (AValue < FValueMin) then
|
||||
AValue := FValueMin
|
||||
else
|
||||
if (AValue > FValueMax) then
|
||||
AValue := FValueMax;
|
||||
if (FValue <> AValue) then
|
||||
begin
|
||||
FValue := AValue;
|
||||
FlblShowText.Caption := FlblShowText.Hint + FloatToStr(FValue);
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TSensorPanel.GetCaption: TCaption;
|
||||
begin
|
||||
// Modif J.P 05/2013 Caption replace Hint
|
||||
Result := FlblShowText.Hint;
|
||||
end;
|
||||
|
||||
procedure TSensorPanel.SetCaption(AValue: TCaption);
|
||||
begin
|
||||
// Modif J.P 05/2013 Caption replace Hint
|
||||
FlblShowText.Hint := AValue;
|
||||
inherited Caption := '';
|
||||
FlblShowText.Caption := FlblShowText.Hint + FloatToStr(FValue);
|
||||
Invalidate;
|
||||
end;
|
||||
|
||||
procedure TSensorPanel.SetShowText(AValue: Boolean);
|
||||
begin
|
||||
if (AValue <> FShowText) then
|
||||
begin
|
||||
FShowText := AValue;
|
||||
FlblShowText.Visible := FShowText;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSensorPanel.SetShowLevel(AValue: Boolean);
|
||||
begin
|
||||
if (AValue <> FShowLevel) then
|
||||
begin
|
||||
FShowlevel := AValue;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSensorPanel.SetColorInd(Index: Integer; AValue: TColor);
|
||||
begin
|
||||
if (AValue <> FColorFore) then
|
||||
begin
|
||||
case Index of
|
||||
0: FColorFore := AValue;
|
||||
1: FColorBack := AValue;
|
||||
2: FColorRed := AValue;
|
||||
3: FColorYellow := AValue;
|
||||
end;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSensorPanel.SetValueMin(AValue: Double);
|
||||
begin
|
||||
if (AValue <> FValueMin) then
|
||||
begin
|
||||
if (AValue > FValueMin) then
|
||||
if not (csLoading in ComponentState) then
|
||||
raise EInvalidOperation.CreateFmt('OutOfRange', [-MaxInt, Round(FValueMax - 1)]);
|
||||
FValueMin := AValue;
|
||||
if (FValue < AValue) then FValue := AValue;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSensorPanel.SetValueMax(AValue: Double);
|
||||
begin
|
||||
if (AValue <> FValueMax) then
|
||||
begin
|
||||
if (AValue < FValueMin) then
|
||||
if not (csLoading in ComponentState) then
|
||||
raise EInvalidOperation.CreateFmt('SOutOfRange', [Round(FValueMin + 1), MaxInt]);
|
||||
FValueMax := AValue;
|
||||
if (FValue > AValue) then FValue := AValue;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSensorPanel.SetValueRed(AValue: Double);
|
||||
begin
|
||||
if (AValue <> FValueRed) then
|
||||
begin
|
||||
if (AValue < FValueMin) or (AValue > FValueMax) then
|
||||
if not (csLoading in ComponentState) then
|
||||
raise EInvalidOperation.CreateFmt('SOutOfRange', [Round(FValueMin), Round(FValueMax)]);
|
||||
FValueRed := AValue;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSensorPanel.SetValueYellow(AValue: Double);
|
||||
begin
|
||||
if (AValue <> FValueYellow) then
|
||||
begin
|
||||
if (AValue < FValueRed) or (AValue > FValueMax) then
|
||||
if not (csLoading in ComponentState) then
|
||||
raise EInvalidOperation.CreateFmt('SOutOfRange', [Round(FValueRed), Round(FValueMax)]);
|
||||
FValueYellow := AValue;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
{ TAnalogSensor }
|
||||
constructor TAnalogSensor.Create(AOwner: TComponent);
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
Value := 20;
|
||||
AnalogKind := akAnalog;
|
||||
end;
|
||||
|
||||
procedure TAnalogSensor.Paint;
|
||||
begin
|
||||
inherited Paint;
|
||||
case FAnalogKind of
|
||||
akAnalog: PaintAsNeedle;
|
||||
akHorizontal: PaintAsHorizontal;
|
||||
akVertical: PaintAsVertical;
|
||||
end;
|
||||
end;
|
||||
|
||||
function SolveForY(X, Z: Double): Double;
|
||||
begin
|
||||
if Z = 0 then
|
||||
Result := 0
|
||||
else
|
||||
Result := X/Z;
|
||||
end;
|
||||
|
||||
procedure TAnalogSensor.PaintAsNeedle;
|
||||
var MiddleX: Integer;
|
||||
Angle: Double;
|
||||
X, Y, W, H: Integer;
|
||||
begin
|
||||
X := 20;
|
||||
Y := 23;
|
||||
W := ClientWidth - 2*20; //130;
|
||||
H := ClientHeight - 2*23; //33;
|
||||
if (W < 1) or (H < 1) then Exit;
|
||||
|
||||
with Canvas do
|
||||
begin
|
||||
Brush.Color := ColorBack;
|
||||
Pen.Color := clBlack;
|
||||
Pen.Width := 1;
|
||||
|
||||
{ draw a pie }
|
||||
Pie(X, Y, X + W, Y + 2*H, X + W, Y + H - 1, X, Y + H - 1);
|
||||
// Chord(X, Y, X+W, (Y+H)*2, X+W, Y+H-1, X, Y+H-1);
|
||||
|
||||
MiddleX := W div 2;
|
||||
{ draw pie for current value }
|
||||
Brush.Color := ColorFore;
|
||||
Pen.Color := clBlack;
|
||||
MoveTo(X + MiddleX, Y + H - 1);
|
||||
Angle := Pi * SolveForY(FValue - FValueMin, FValueMax - FValueMin);
|
||||
Pie(X, Y, X + W, Y + 2*H, Round(X + MiddleX*(1 - Cos(Angle))), Round(Y - 1 + H*(1 - Sin(Angle))), X, Y+H);
|
||||
|
||||
if FShowLevel then
|
||||
begin
|
||||
// Pen.Width := 1;
|
||||
{ draw a RED level line }
|
||||
Pen.Color := ColorRed;
|
||||
MoveTo(X + MiddleX, Y + H - 1);
|
||||
Angle := Pi * SolveForY(FValueRed - FValueMin, FValueMax - FValueMin);
|
||||
LineTo(Round(X + MiddleX*(1 - Cos(Angle))), Round(Y - 1 + H*(1 - Sin(Angle))));
|
||||
|
||||
{ draw a YELLOW level line }
|
||||
Pen.Color := ColorYellow;
|
||||
MoveTo(X + MiddleX, Y + H - 1);
|
||||
Angle := Pi * SolveForY(FValueYellow - FValueMin, FValueMax - FValueMin);
|
||||
LineTo(Round(X + MiddleX*(1 - Cos(Angle))), Round(Y - 1 + H*(1 - Sin(Angle))));
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TAnalogSensor.PaintAsHorizontal;
|
||||
var MiddleX: Integer;
|
||||
X, Y, W, H: Integer;
|
||||
begin
|
||||
X := 20;
|
||||
Y := 23;
|
||||
W := ClientWidth - 2*20; //130;
|
||||
H := ClientHeight - 2*23; //33;
|
||||
if (W < 1) or (H < 1) then Exit;
|
||||
|
||||
with Canvas do
|
||||
begin
|
||||
Brush.Color := ColorBack;
|
||||
Pen.Color := clBlack;
|
||||
Pen.Width := 1;
|
||||
|
||||
Rectangle(X, Y, X + W, Y + H);
|
||||
|
||||
{ draw pie for current value }
|
||||
Brush.Color := ColorFore;
|
||||
Pen.Color := clBlack;
|
||||
MiddleX := Round(W*SolveForY(FValue - FValueMin, FValueMax - FValueMin));
|
||||
Rectangle(X, Y, X + MiddleX, Y + H);
|
||||
|
||||
if FShowLevel then
|
||||
begin
|
||||
{ draw a RED level line }
|
||||
Pen.Color := ColorRed;
|
||||
MiddleX := Round(W*SolveForY(FValueRed - FValueMin, FValueMax - FValueMin));
|
||||
MoveTo(X + MiddleX, Y + 1);
|
||||
LineTo(X + MiddleX, Y + H - 1);
|
||||
|
||||
{ draw a YELLOW level line }
|
||||
Pen.Color := ColorYellow;
|
||||
MiddleX := Round(W*SolveForY(FValueYellow - FValueMin, FValueMax - FValueMin));
|
||||
MoveTo(X + MiddleX, Y + 1);
|
||||
LineTo(X + MiddleX, Y + H - 1);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TAnalogSensor.PaintAsVertical;
|
||||
var MiddleY: Integer;
|
||||
X, Y, W, H: Integer;
|
||||
begin
|
||||
X := 20;
|
||||
Y := 23;
|
||||
W := ClientWidth - 2*20; //130;
|
||||
H := ClientHeight - 2*23; //33;
|
||||
if (W < 1) or (H < 1) then Exit;
|
||||
|
||||
with Canvas do
|
||||
begin
|
||||
Brush.Color := ColorBack;
|
||||
Pen.Color := clBlack;
|
||||
Pen.Width := 1;
|
||||
|
||||
Rectangle(X + W - 1, Y + H - 1, X, Y);
|
||||
|
||||
{ draw pie for current value }
|
||||
Brush.Color := ColorFore;
|
||||
Pen.Color := clBlack;
|
||||
MiddleY := Round(H*SolveForY(FValue - FValueMin, FValueMax - FValueMin));
|
||||
Rectangle(X, Y + H - 1 - MiddleY, X + W - 1, Y + H - 1);
|
||||
|
||||
if FShowLevel then
|
||||
begin
|
||||
{ draw a RED level line }
|
||||
Pen.Color := ColorRed;
|
||||
MiddleY := Round(H*SolveForY(FValueRed - FValueMin, FValueMax - FValueMin));
|
||||
MoveTo(X + 1, Y + H - 1 - MiddleY);
|
||||
LineTo(X + W - 1, Y + H - 1 - MiddleY);
|
||||
|
||||
{ draw a YELLOW level line }
|
||||
Pen.Color := ColorYellow;
|
||||
MiddleY := Round(H*SolveForY(FValueYellow - FValueMin, FValueMax - FValueMin));
|
||||
MoveTo(X + 1, Y + H - 1 - MiddleY);
|
||||
LineTo(X + W - 1, Y + H - 1 - MiddleY);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TAnalogSensor.SetAnalogKind(AValue: TAnalogKind);
|
||||
begin
|
||||
if (AValue <> FAnalogKind) then
|
||||
begin
|
||||
FAnalogKind := AValue;
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
{ TStopLightSensor }
|
||||
constructor TStopLightSensor.Create(AOwner: TComponent);
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
|
||||
Width := 23;
|
||||
Height := 43;
|
||||
Center := True;
|
||||
FState := slRED;
|
||||
State := slUNKNOWN;
|
||||
end;
|
||||
|
||||
procedure TStopLightSensor.SetState(AValue: TStopLights);
|
||||
begin
|
||||
if (AValue <> FState) then
|
||||
begin
|
||||
FState := AValue;
|
||||
|
||||
case AValue of
|
||||
slUNKNOWN: Picture.LoadFromResourceName(HInstance, 'STOP_UNKNOWN', TPortableNetworkGraphic);
|
||||
slRED: Picture.LoadFromResourceName(HInstance, 'STOP_RED', TPortableNetworkGraphic);
|
||||
slYELLOW: Picture.LoadFromResourceName(HInstance, 'STOP_YELLOW', TPortableNetworkGraphic);
|
||||
slGREEN: Picture.LoadFromResourceName(HInstance, 'STOP_GREEN', TPortableNetworkGraphic);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
end.
|