The example code does not include standard Flex validators inside 
<fx:validators>
,
but this is supported, too. For example, you can add the following line in the
validators
section of a 
DataFormItem
right under the 
<mx:Array>
tag:
<mx:StringValidator id="requiredValidator"
requiredFieldError="Provide non-empty value here" />
If you do it, you’ll have three validators bound to the same form item, 
End Date
: one
standard Flex validator and two functions with validation rules.
From the application programmer’s perspective, using such validation rules is simple.
It allows reusing validators, which can be nicely encapsulated inside the form items.
For brevity, the function 
onSave()
just displays a message box stating that the validation
failed:
mx.controls.Alert.show("Validation failed");
But if you run this application through a debugger and place a breakpoint inside the
function 
isDataValid()
, you’ll see all validation errors in the 
failedLeft
and
failedRight
arrays (Figure 3-6).
The next question is, “How does all this work?”
Figure 3-6. Debugger’s view of validation errors
The ValidationRule Class Explained
Enhancing the original Flex validators, the new 
ValidationRule
extends the Flex
Validator
and is known to clear.swc’s UI controls. With it, developers can attach any
Validation | 157
Convert multipage pdf to jpg - Convert PDF to JPEG images in C#.net, ASP.NET MVC, WinForms, WPF project
How to convert PDF to JPEG using C#.NET PDF to JPEG conversion / converter library control SDK
c# convert pdf to jpg; convert pdf document to jpg
Convert multipage pdf to jpg - VB.NET PDF Convert to Jpeg SDK: Convert PDF to JPEG images in vb.net, ASP.NET MVC, WinForms, WPF project
Online Tutorial for PDF to JPEG (JPG) Conversion in VB.NET Image Application
change file from pdf to jpg; convert multiple page pdf to jpg
number of validation rules to any field of a form or a list-based component. This means
you can attach validation rules not only on the field level, but also on the parent level,
such as to a specific 
DataGrid
column or to an entire row.
When we designed the class, our approach was to separate (for real) validation rules
from the UI component they validate. We also made them reusable to spare application
developers from copy/pasting the same rule repeatedly. With the 
ValidationRule
class,
you can instantiate each rule once and reuse it across the entire application. Our goal
was to move away from one-to-one relationships between a validator and a single
property of a form field, to many-to-many relationships where each field can request
multiple validators and vice versa.
If you don’t need to perform cross-field validation in the form, you can continue using
the original Flex validator classes. If you need to validate interdependent fields—if, say,
the amount field has a value greater than $10K, and you need to block overnight delivery
of the order field until additional approval is provided—use our more flexible exten-
sion, 
ValidationRule
.
We still want to be able to reuse the validators (
EmailValidator
StringValidator
, etc.)
that come with Flex, but they should be wrapped in our 
ValidationRule
class. On the
other hand, with the 
ValidationRule
class, the application developers should also be
able to write validation rules as regular functions, which requires less coding.
The source code of the 
ValidationRule
class that supports all this functionality is listed
in Example 3-18.
Example 3-18. The ValidationRule class
package com.farata.validators{
import mx.controls.Alert;
import flash.utils.describeType;
import mx.events.ValidationResultEvent;
import mx.validators.ValidationResult;
import mx.validators.Validator;
public class ValidationRule   extends Validator{
public var args:Array = [];
public var wrappedRule:Function ;
public var errorMessage : String = "[TODO] replace me";
public var data:Object;
public function ValidationRule() {
super();
required = false;
}
private function combineArgs(v:Object):Array {
var _args:Array = [v];
if( args!=null && args.length>0 )
_args["push"].apply(_args, args);
return  _args;
}
158 | | Chapter 3: Building an Enterprise Framework
VB.NET PDF Convert to Images SDK: Convert PDF to png, gif images
Convert PDF documents to multiple image formats, including Jpg, Png, Bmp, Gif, Tiff, Bitmap, .NET Graphics, and REImage. Turn multipage PDF file into image
convert pdf file to jpg format; convert multi page pdf to single jpg
C# PDF Convert to Images SDK: Convert PDF to png, gif images in C#
NET control able to batch convert PDF documents to image Create image files including all PDF contents, like Turn multipage PDF file into single image files
change pdf file to jpg online; convert pdf image to jpg image
public function set rule(f:Object) : void {
if (!(f is Function)){
Alert.show(""+f, "Incorrect Validation Rule" );
return; // You may throw an exception here
}
wrappedRule = function(val:Object) :Boolean {
return f(val);
}
}
private function substitute(...rest):String {
var len:uint = rest.length;
var args:Array;
var str:String = "" + errorMessage;
if (len == 1 && rest[0] is Array){
args = rest[0] as Array;
len = args.length;
}
else{
args = rest;
}
for (var i:int = 0; i < len; i++){
}
if ( args.length == 1 && args[0] is Object) {
var o:Object = args[0];
for each (var s:*  in o){
}
var classInfo:XML = describeType(o);
// List the object's variables, their values, and their types.
for each (var v:XML in classInfo..variable) {
}
// List accessors as properties
for each (var a:XML in classInfo..accessor) {
// Do not get the property value if it is write-only
if (a.@access != 'writeonly') {
}
}
}
return str;
}
override protected function doValidation(value:Object):Array{
var results:Array = [];
Validation | 159
C# PDF insert image Library: insert images into PDF in C#.net, ASP
Add multiple images to multipage PDF document in .NET WinForms. Support various image formats, like Jpeg or Jpg, Png, Gif, Bmp, Tiff and other bitmap images.
convert .pdf to .jpg online; convert from pdf to jpg
C# Create PDF Library SDK to convert PDF from other file formats
such as tiff, jpg, png, gif, bmp, etc. Create writable PDF from text (.txt) file. HTML webpage to interactive PDF file creator freeware. Create multipage PDF from
convert pdf to jpg converter; change format from pdf to jpg
if (!wrappedRule(data))
results.push(new ValidationResult(true, null, "Error",
substitute(combineArgs(data))));
return results;
}
override public function validate(value:Object = null,
if (value == null)
value = getValueFromSource();
// If the required flag is true and there is no value,
// we need to generate a required field error
if (isRealValue(value) || required){
return super.validate(value, suppressEvents);
}
else {
// Just return the valid value
}
}
}
}
The superclass 
Validator
has two methods that will be overridden in its descendants:
doValidation()
, which initiates and performs the validation routine, and the function
validate()
, which watches required arguments and gets the values from the target UI
control.
Notice that this code fragment from the DataFormValidation.mxml application:
<fx:ValidationRule rule="{afterStartDate}"
</fx:ValidationRule>
mentions the name of the function 
afterStartDate
that alternatively could have been
declared inline as a closure. The function ensures that the date being validated is older
than the 
END_DATE
:
private function afterToday( val: Object) : Boolean {
var b : Boolean = val.END_DATE > new Date();
return b;
}
In this code, 
val
points at the 
dataProvider
of the form, which, in the sample applica-
tion, is an instance of the 
vacationRequestDTO
. An important point is that both the
DataForm
and the 
ValidationRule
see the same 
dataProvider
.
The value of the 
errorMessage
attribute includes something that looks like a macro
language: 
($[END_DATE])
. The function 
substitute()
finds and replaces via regular ex-
pression the specified name (e.g., 
END_DATE
) in all properties in the 
dataProvider
with
their values.
160 | | Chapter 3: Building an Enterprise Framework
VB.NET Create PDF Library SDK to convert PDF from other file
Best VB.NET component to convert Microsoft Office Word HTML webpage to interactive PDF file creator freeware. Create multipage PDF from OpenOffice and CSV file.
changing pdf to jpg on; batch pdf to jpg converter
C# PDF Convert to Tiff SDK: Convert PDF to tiff images in C#.net
multipage tiff image files can be created from PDF. Supports tiff compression selection. Supports for changing image size. Also supports convert PDF files to jpg
.pdf to jpg; best pdf to jpg converter online
If 
dataProvider
is a dynamic object, the function 
ValidationRule.substitute()
enu-
merates all its properties via a 
for each
loop. For regular classes, Flex offers a reflection
mechanism using the function 
describeType()
; give it a class name and it’ll return a
definition of this class in a form of XML. Then the function 
substitute()
gets all class
variables and accessors (getters and setters) and applies the regular expression to the
errorMessage
text.
For example, if you deal with a dynamic object 
o
that has a property 
END_DATE
, the
following line will replace 
($[END_DATE])
in the error text with the value of this property
o[s]
:
str = str.replace(new RegExp("\\$\\["+s+"\\]", "g"), o[s]);
The method 
substitute()
is called from 
doValidate()
, and if the user enters invalid
dates (for example, if the start date is 12/10/2008 and the end date 12/06/2008), the
validator will find the properties called 
END_DATE
and 
START_DATE
and turn this error text:
"End Date ($[END_DATE]) must be later than Start Date $[START_DATE]"
into this one:
"End Date (12/06/2008) must be later than Start Date 12/10/2008"
In Chapter 2, you learned how to write class factories that can wrap functions and
return them as objects. This technique is applied in the 
ValidationRule
class, too, which
supports functions as validators. If the application code uses the setter 
rule
, the func-
tion with business-specific validation rules is expected.
The class 
ValidationRule
has this setter:
public function set rule(f:Object) : void {
if (!(f is Function)){
Alert.show(""+f, "Incorrect Validation Rule" );
return;
}
wrappedRule = function(val:Object) :Boolean {
return f(val);
}
}
In the application DataFormValidation.mxml, you can easily find that this setter has
been used (we already discussed the function 
afterStartDate
earlier):
<fx:ValidationRule
rule="{afterStartDate}"
errorMessage="End Date ($[END_DATE]) must be later
than Start Date $[START_DATE]">
</fx:ValidationRule>
We hope you like the simplicity that 
ValidationRule
offers to application developers
who have to validate forms. The next section examines a sample application that dem-
onstrates the use of this class in a 
DataGrid
control.
Validation | 161
Embedding Validation Rules into a DataGrid
As opposed to component libraries, classes in a framework depend on each other. In
this context, this means that the 
ValidationRule
class requires an enhanced 
DataGrid
component.
Please note that the sample application shown next uses 
DataGrid
and
DataGridItem
from a different namespace. These classes are included in
the clear.swc library and come with the source code accompanying the
book, but due to space constraints, we won’t include the source code
of these objects here.
This example is yet another version of the Café Townsend application from Chap-
ter 1. For simplicity, the employee data hardcoded, and to run this application you
don’t need to do any server-side setup.
This application is an example of a master/detail window with validators embedded
inside a data grid. Figure 3-7 shows the phone number having the wrong number of
digits in the first row of our 
DataGrid
component. The embedded validation rule prop-
erly reports an error message that reads, “Wrong length, need 10 digit number.”
Figure 3-7. Validating the phone DataGridColumn
You can also assign validation rules to the form items that show details of the selected
row. In Figure 3-8 you can see a validation error message stating that “Salary (9.95) is
out of reasonable range.” All fields that have invalid values have red borders. While
examining the source code, please note that the drop-down box “Department” was
populated using a resource file.
The version of the Café Townsend application in Example 3-19 uses the custom object
Employee_getEmployees_gridFormTest
.
162 | | Chapter 3: Building an Enterprise Framework
Example 3-19. Code of Café Townsend with validations
<?xml version="1.0" encoding="UTF-8"?>
creationComplete="fill_onClick()">
method="getEmployees"  collectionChange="trace(event)"
<mx:Canvas height="100%" width="100%">
<mx:Panel title="Employee List" width="100%" height="100%">
<fx:DataGrid id="dg"
itemRenderer="{new
editable="true" height="100%" rowHeight="25">
<fx:columns>
<fx:DataGridColumn dataField="DEPT_ID"   editable="false"
headerText="Department"
<fx:DataGridColumn dataField="STREET"  headerText="Street"/>
<fx:DataGridColumn dataField="CITY"  headerText="City"/>
<fx:DataGridColumn dataField="STATE"  editable="false"
headerText="State"
resource="{com.farata.resources.StateComboResource}"/>
formatString="zip" >
<fx:validators>
<mx:ZipCodeValidator />
</fx:validators>
</fx:DataGridColumn>
formatString="phone"  >
Figure 3-8. Validating the salary DataGridColumn
Validation | 163
<fx:validators>
<mx:Array>
length, need 10 digit number"/>
</mx:Array>
</fx:validators>
</fx:DataGridColumn>
<fx:DataGridColumn dataField="STATUS"  headerText="Status"/>
<fx:validators>
<mx:SocialSecurityValidator/>
</fx:validators>
</fx:DataGridColumn>
<fx:DataGridColumn dataField="SALARY" headerText="Salary"
formatString="currency(2)">
<fx:validators>
<mx:Array>
<fx:ValidationRule
rule="{function(data:Object):Boolean
&amp;&amp; data.SALARY < 500000);}}"
</mx:Array>
</fx:validators>
</fx:DataGridColumn>
formatString="shortDate"/>
<fx:DataGridColumn dataField="TERMINATION_DATE"
<fx:validators>
<fx:ValidationRule
rule="{afterStartDate}"
</fx:ValidationRule>
</fx:validators>
</fx:DataGridColumn>
formatString="shortDate"/>
164 | | Chapter 3: Building an Enterprise Framework
resource="com.farata.resources.YesNoCheckBoxResource"
rendererIsEditor="true"/>
<fx:DataGridColumn dataField="SEX"  headerText="Sex"
</fx:columns>
</fx:DataGrid>
<fx:DataForm dataProvider="{dg.selectedItem}">
<mx:HBox>
<mx:Form>
<fx:DataFormItem dataField="EMP_ID" label="Emp Id:"/>
<fx:DataFormItem dataField="STREET" label="Street:"/>
<fx:DataFormItem dataField="CITY" label="City:"/>
formatString="shortDate" required="true"/>
<fx:DataFormItem dataField="STATUS" label="Status:"
required="true"/>
</mx:Form>
<mx:Form>
<fx:DataFormItem dataField="STATE" label="State:"
<fx:DataFormItem dataField="SALARY" label="Salary:"
formatString="currency" textAlign="right">
<fx:validators>
data.SALARY < 500000);}}"
errorMessage="Salary ($[SALARY]) is out
</fx:validators>
</fx:DataFormItem>
formatString="shortDate"/>
<fx:DataFormItem dataField="BENE_LIFE_INS" label="Life:"
resource="{YesNoCheckBoxResource}"/>
<fx:DataFormItem dataField="SEX" label="Sex:"
resource="{SexRadioResource}"/>
</mx:Form>
<mx:Form>
<fx:DataFormItem dataField="DEPT_ID" label="Department:"
resource="{DepartmentComboResource}"/>
itemEditor="{com.farata.controls.MaskedInput}"
Validation | 165
<fx:validators>
<mx:SocialSecurityValidator/>
</fx:validators>
</fx:DataFormItem>
<fx:DataFormItem dataField="ZIP_CODE" label="Zip Code:"
formatString="zip">
<fx:validators>
<mx:ZipCodeValidator />
</fx:validators>
</fx:DataFormItem>
<fx:DataFormItem dataField="PHONE" label="Phone Number:"
itemEditor="{com.farata.controls.MaskedInput}"
formatString="phone">
<fx:validators>
<mx:PhoneNumberValidator
wrongLengthError="keep typing"/>
</fx:validators>
</fx:DataFormItem>
<fx:DataFormItem dataField="TERMINATION_DATE"
<fx:validators>
<fx:ValidationRule
rule="{afterStartDate}"
later than Start Date $[START_DATE]">
</fx:ValidationRule>
</fx:validators>
</fx:DataFormItem>
resource="{YesNoCheckBoxResource}"/>
</mx:Form>
</mx:HBox>
</fx:DataForm>
</mx:Panel>
<mx:HBox horizontalScrollPolicy="off" verticalAlign="middle" height="30"
width="100%">
<mx:Spacer width="100%"/>
<mx:VRule strokeWidth="2" height="24"/>
<mx:Button enabled="{dg.selectedIndex != -1}"
icon="@Embed('/assets/delete_16x16.gif')"/>
icon="@Embed('/assets/add_16x16.gif')" />
<mx:Label text="Deleted: {collection.deletedCount}"/>
<mx:Label text="Modified: {collection.modifiedCount}"/>
</mx:HBox>
</mx:Canvas>
<mx:Script>    <![CDATA[
import com.farata.controls.dataGridClasses.DataGridItemRenderer;
import com.farata.core.UIClassFactory;
import com.farata.collections.DataCollection;
import mx.collections.ArrayCollection;
import mx.controls.dataGridClasses.DataGridColumn;
166 | | Chapter 3: Building an Enterprise Framework
Documents you may be interested
Documents you may be interested