UIButton with gradient background and image on it!

by Mark Deraeve 12. September 2014 01:09

I got a request for an app with lots of gradient styles on all kinds of controls.

When I applied the typical code to the UIButton, the text stayed on but the image disappeared.

So I found that the solution is to bring the UIImageview to the front like this:

[vw bringSubviewToFront:vw.imageView];

Now the complete code to make the UIButton look like this:

is this:

+ (void) MakeNormalButton:(UIButton *) vw

{

    CAGradientLayer *gradient = [CAGradientLayerlayer];

    gradient.frame = vw.bounds;

    gradient.colors = [NSArrayarrayWithObjects:(id)[[UIColorwhiteColor] CGColor], (id)[[UIColorlightGrayColor] CGColor], nil];

    [vw.layer insertSublayer:gradient atIndex:0];

    vw.layer.masksToBounds = NO;

    vw.layer.shouldRasterize = YES;

    [vw.layersetShadowColor:[UIColorblackColor].CGColor];

    [vw.layersetShadowOpacity:0.5];

    [vw.layersetShadowRadius:2.0];

    [vw.layersetShadowOffset:CGSizeMake(2.0f, 2.0f)];

    [vw.layersetCornerRadius:5.0f];

    [vw bringSubviewToFront:vw.imageView];

 

}


Tags:

ASP.Net: Entity Framework 6.0 with ASP.Net Web API

by Mark Deraeve 12. June 2014 22:37

Coming from WCF services with SOAP, this is a revolution. .Net Web API is really straight forward, easy to implement and powerfull, connectable for all systems. 

For my iOS app, I'm switching from the old SOAP XML protocol to JSON, from WCF to web API and REST.

The first project was a succes after 1 day. The initial setup required almost no code, only scaffolding and some configuration.

I bumped into a small problem, which I document together with the solution in the following report.

The solution consist out of 2 projects, A class library and .Net Web API. To create the .Net Web API is really simple, look here if you do not know how. Next in the class libary I added an EF 6.0 model with some tables from my database. Add a reference to this class library project containing the EF Model to your web API project.

I removed the Model folder in the Web API because we use the model from EF project.

Now I click right on the Controller folder, choose add, controller. You'll see a choice of scaffolds to choose from.

We choose the Web API 2 Controller with actions, using Entity Framework. Then you'll see the add controller dialog, where you choose your model class from your entity model, and the data context. The choices should be there.

 

Now when you click add, it could happen that you'll get this error message (Unable to retrieve metadata for ''. No connection string named '' could be found in the application config file.):

The error is self explaining, you'll have to add the connection string for the EF in the web.config of your web API project. Copy the section from your app.config in the project where you have created the EF model, add it to the web.config of the Web API project.

Now try to add the controller scaffold again, it should work and you'll see the controller scaffold added to your project. 

You can already test this controller in your browser.


Tags:

iOS: Picture editor (zooming, drawing, ...) complete code

by Mark Deraeve 11. June 2014 00:43

I needed a view controller that could edit an image. But not just edit, also zoom in and out on the image and moving the image in the canvas.

So I created a separate XIB file with view and a view controller. It's working perfect. The first version was without zoom, so it resized the image to the screen size. In this case we always lost the resolution of the image.

So first a little demo with some pictures:

After taking the picture with the camera, a thumbnail appears in the picture list. By clicking on it, we are redirected to the picture edit screen. This is done on the 'didSelectItemAtIndexPath' method of the collection view (code see below following picture):

 

The code to accomplish this is reasonably simple. I get the asset based on the picture URL that is saved in the collection view item:

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

{

    if(showZones==NO)

    {

        ImageThumbView * cell = (ImageThumbView *)[collectionView cellForItemAtIndexPath:indexPath];

        typedef void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *asset);

        typedef void (^ALAssetsLibraryAccessFailureBlock)(NSError *error);

 

        Picture * p = [picturesForProject objectAtIndex:indexPath.row];

        

        ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)

        {

            ALAssetRepresentation *rep = [myasset defaultRepresentation];

            CGImageRef iref = [rep fullResolutionImage];

 

            if (iref)

            {

                @try {

                    self.img = [UIImage imageWithCGImage:iref scale:[rep scale] orientation:(UIImageOrientation)[rep orientation]];

                    [StoryBoardNavigation NavigateToChangePictureStoryboard:selfAndPicture:self.imgAndPictureObject:cell.pic];

                }

                @catch (NSException *exception) {

                    NSLog(@"Exception:%@",exception);

                    [cell.imgImage setImage:[UIImage imageNamed:@"error.png"]];

                }

            }

            else

            {

                [cell.imgImage setImage:[UIImage imageNamed:@"error.png"]];

            }

        };

        

        ALAssetsLibraryAccessFailureBlock failureblock  = ^(NSError *myerror)

        {

            NSLog(@"can't get image");

        };

        NSURL *asseturl = [NSURL URLWithString:p.picture_url];

        [assetslibrary assetForURL:asseturl

                       resultBlock:resultblock

                      failureBlock:failureblock];

    }

 

}

 

Here the code to call the picture edit, so here you actually provide the PictureEdit view controller with a image object:

+(void) NavigateToChangePictureStoryboard:(UIViewController *) vc AndPicture:(UIImage *) image AndPictureObject:(Picture *) pic

{

    PictureEditVC * vcTo = [[PictureEditVCallocinitWithNibName:@"PictureEditVC"bundle:nil];

    vcTo.imageForMainView = image;

    vcTo.pic = pic;

    [UIViewtransitionWithView:vc.viewduration:0.8options:UIViewAnimationOptionTransitionCrossDissolve

                    animations:^{

                        [vc.navigationController pushViewController:vcTo animated:NO];

                    }

                    completion:NULL];

 

 

}

Now we end up on the picture edit screen. On top you see 3 buttons, the first on the left saves the images if there were changes made. The second on the left cancels the changes. The button on the right switches between zooming and editing. Below the zooming mode is set, you can zoom by using the pinch gesture and you can move the picture with the pan gesture.

Before we edit, we click on the edit button, and you'll see the different color buttons appear. 

We click on the red button and draw the little red heart on the image.

Now lets zoom in. Click on the edit button to go to zoom mode and zoom in:

Now we click again on the edit button to edit and draw some yellow hearts:

Zoom out again and save:

If you look closely the thumbnail reflects the changes. A copy of the changed image is also saved in the library.

Before we look into the code of the view controller that does all the work, first thing is to create a XIB.

Create the XIB file with the view controller. The xib file is very simple and could look like this:

 

I provide 2 properties (Basically you only will need the first). The first is the image to edit, the second is the picture object with the url of the picture (I use this to store the picture reference in the local DB), if we change the picture, we will change the picture objects url.

The .h file of the picture edit view controller is very simple:

//

//  PictureEditVC.h

//  LocationReport

//

//  Created by Mark Deraeve on 03/06/14.

//  Copyright (c) 2014 AssistU. All rights reserved.

//

 

#import <UIKit/UIKit.h>

#import "Button.h"

#import "Picture.h"

 

@interface PictureEditVC : HomeVC <UIScrollViewDelegate>

 

@property (weak, nonatomic) IBOutlet Button *btnEdit;

@property (weak, nonatomic) IBOutlet Button *btnUndo;

@property (weak, nonatomic) IBOutlet Button *btnSave;

 

@property (weak, nonatomic) IBOutlet UIButton *btnYellow;

@property (weak, nonatomic) IBOutlet UIButton *btnGreen;

@property (weak, nonatomic) IBOutlet UIButton *btnRed;

@property (weak, nonatomic) IBOutlet UIButton *btnBlack;

 

@property (weak, nonatomic) UIImage * imageForMainView;

 

@property (weak, nonatomic) Picture * pic;

 

 

@end

It just has the outlets for the buttons and the image property and the picture object property. (You can easely change the type Button to UIButton, it's only for layout purpose.

Now all you need is the implementation file:

//

//  PictureEditVC.m

//  LocationReport

//

//  Created by Mark Deraeve on 03/06/14.

//  Copyright (c) 2014 AssistU. All rights reserved.

//

 

#import "PictureEditVC.h"

#import <AssetsLibrary/AssetsLibrary.h>

 

@interfacePictureEditVC ()

 

@end

 

@implementation PictureEditVC

{

    bool drawActive;

    CGPoint cumTranslation;

    CGFloat red;

    CGFloat green;

    CGFloat blue;

    CGFloat brush;

    CGFloat opacity;

    CGRect pageRect;

    UIImage * initImage;

    UIImageView * tempDrawImage;

    UIImageView * mainImageView;

    UIScrollView * scrollView;

    bool mouseSwiped;

    CGPoint lastPoint;

    CGPoint scaleLastPoint;

}

 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) {

        // Custom initialization

    }

    returnself;

}

 

- (void)viewDidLoad

{

    [superviewDidLoad];

     [GeneralFunctionsMakeSelectedButton:self.btnBlack];

}

 

-(void) viewDidAppear:(BOOL)animated

{

    // Do any additional setup after loading the view from its nib.

    tempDrawImage.userInteractionEnabled =YES;

    cumTranslation = CGPointMake(0,0);

    

    drawActive = NO;

    red = 0.0/255.0;

    green = 0.0/255.0;

    blue = 0.0/255.0;

    

    brush = 3.0;

    opacity = 1.0;

    

    mainImageView.contentMode = UIViewContentModeScaleAspectFit;

    if (self.imageForMainView)

    {

        mainImageView = [[UIImageViewalloc] initWithImage:self.imageForMainView];

        pageRect = CGRectMake(0, 0, self.imageForMainView.size.width, self.imageForMainView.size.height);

        //mainImageView.image = self.imageForMainView;

    }

    else

    {

        pageRect = self.view.frame;

        pageRect.origin = CGPointMake(0,0);

        mainImageView = [[UIImageViewalloc] initWithFrame:pageRect];

    }

    

    tempDrawImage =[[UIImageViewalloc] initWithFrame:pageRect];

    

    scrollView = [[UIScrollViewalloc] initWithFrame:pageRect];

    scrollView.delegate = self;

    scrollView.minimumZoomScale = 0.3;

    scrollView.maximumZoomScale = 3.0;

    

    [scrollViewsetBackgroundColor:[UIColorredColor]];

    

    scrollView.contentSize= pageRect.size;

    

    [scrollViewaddSubview:mainImageView];

    [scrollViewaddSubview:tempDrawImage];

    [scrollViewsendSubviewToBack:mainImageView];

    

    [self.view addSubview:scrollView];

    [self.viewsendSubviewToBack: scrollView];

    

    UIPanGestureRecognizer *Scrolling  = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(onScroll:)];

    UIPinchGestureRecognizer *Zooming   = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(onZoom:)];

    UITapGestureRecognizer *Tap   = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTap:)];

    

    [scrollView addGestureRecognizer:Scrolling];

    [scrollView addGestureRecognizer:Zooming];

    [scrollView addGestureRecognizer:Tap];

}

 

#pragma mark Zoom / Draw

 

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView

{

    return tempDrawImage;

}

 

- (void)onTap:(UIPinchGestureRecognizer*)sender

{

    if (drawActive)

    {

        UIGraphicsBeginImageContext(tempDrawImage.frame.size);

        [tempDrawImage.image drawInRect:CGRectMake(0, 0, tempDrawImage.frame.size.width, tempDrawImage.frame.size.height)];

        

        CGPoint currentPoint = [sender locationInView:tempDrawImage];

        

        CGPoint scalePoint;

        scalePoint.x = currentPoint.x*scrollView.zoomScale;

        scalePoint.y = currentPoint.y*scrollView.zoomScale;

        

        CGRect borderRect = CGRectMake(scalePoint.x, scalePoint.y, brush, brush);

        CGContextRef context = UIGraphicsGetCurrentContext();

        CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);

        CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, 1.0);

        CGContextSetLineWidth(context, brush);

        CGContextFillEllipseInRect (context, borderRect);

        CGContextStrokeEllipseInRect(context, borderRect);

        CGContextFillPath(context);

        

        CGContextFlush(UIGraphicsGetCurrentContext());

        tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext();

        UIGraphicsEndImageContext();

        

        //Draw dot.

        

    }

}

 

- (void)onZoom:(UIPinchGestureRecognizer*)sender

{

    if (!drawActive)

    {

        sender.view.transform = CGAffineTransformScale(sender.view.transform, sender.scale, sender.scale);

        sender.scale = 1;

    }

}

 

- (void)onScroll:(UIPanGestureRecognizer*)sender

{

    if (drawActive==NO)

    {

        CGPoint translation = [sender translationInView:self.view];

        sender.view.center = CGPointMake(sender.view.center.x + translation.x,

                                         sender.view.center.y + translation.y);

        [sender setTranslation:CGPointMake(0, 0) inView:self.view];

        cumTranslation = CGPointMake(cumTranslation.x + translation.x,

                                     cumTranslation.y + translation.y);

    }

    else

    {// Processing the drawing by using comparing:

        if (sender.state == UIGestureRecognizerStateBegan)

        { /* drawing began */

            

            mouseSwiped = NO;

            

            lastPoint = [sender locationInView:tempDrawImage];

            scaleLastPoint.x = lastPoint.x*scrollView.zoomScale;

            scaleLastPoint.y = lastPoint.y*scrollView.zoomScale;

            

        }

        else if (sender.state == UIGestureRecognizerStateChanged)

        { /* drawing occured */

            mouseSwiped = YES;

            

            CGPoint currentPoint = [sender locationInView:tempDrawImage];

            

            CGPoint scalePoint;

            scalePoint.x = currentPoint.x*scrollView.zoomScale;

            scalePoint.y = currentPoint.y*scrollView.zoomScale;

            

            UIGraphicsBeginImageContext(tempDrawImage.frame.size);

            [tempDrawImage.image drawInRect:CGRectMake(0, 0, tempDrawImage.frame.size.width, tempDrawImage.frame.size.height)];

            CGContextMoveToPoint(UIGraphicsGetCurrentContext(), scaleLastPoint.x, scaleLastPoint.y);

            CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), scalePoint.x, scalePoint.y);

            CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);

            CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush );

            CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, 1.0);

            CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeNormal);

            

            CGContextStrokePath(UIGraphicsGetCurrentContext());

            tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext();

            [tempDrawImage setAlpha:opacity];

            UIGraphicsEndImageContext();

            

            scaleLastPoint = scalePoint;

        }

        else if (sender.state == UIGestureRecognizerStateEnded)

        { /* drawing ended */

            if(!mouseSwiped) {

                UIGraphicsBeginImageContext(tempDrawImage.frame.size);

                [tempDrawImage.image drawInRect:CGRectMake(0, 0, tempDrawImage.frame.size.width, tempDrawImage.frame.size.height)];

                CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);

                CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush);

                CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, opacity);

                CGContextMoveToPoint(UIGraphicsGetCurrentContext(), scaleLastPoint.x, scaleLastPoint.y);

                CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), scaleLastPoint.x, scaleLastPoint.y);

                CGContextStrokePath(UIGraphicsGetCurrentContext());

                CGContextFlush(UIGraphicsGetCurrentContext());

                tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext();

                UIGraphicsEndImageContext();

            }

        }

    }

}

 

#pragma mark Button events

 

- (IBAction)btnEditClicked:(id)sender

{

    drawActive = !drawActive;

    self.btnBlack.hidden = !drawActive;

    self.btnGreen.hidden = !drawActive;

    self.btnRed.hidden = !drawActive;

    self.btnYellow.hidden = !drawActive;

    if (drawActive==YES)

    {

        [self.btnEdit setTitle:[[VariableStore sharedInstance] Translate:@"$PO$Zoom"] forState:UIControlStateNormal];

    }

    else

    {

        [self.btnEdit setTitle:[[VariableStore sharedInstance] Translate:@"$PO$Draw"] forState:UIControlStateNormal];

    }

}

- (IBAction)btnYellowClicked:(id)sender

{

    red = 255/255.0;

    green = 255.0/255.0;

    blue = 0.0/255.0;

    [self SetClicked:self.btnYellow];

}

- (IBAction)btnGreenClicked:(id)sender

{

    red = 0.0/255.0;

    green = 255.0/255.0;

    blue = 0.0/255.0;

    [self SetClicked:self.btnGreen];

}

- (IBAction)btnRedClicked:(id)sender

{

    red = 255.0/255.0;

    green = 0.0/255.0;

    blue = 0.0/255.0;

    [self SetClicked:self.btnRed];

}

- (IBAction)btnBlackClicked:(id)sender

{

    red = 0.0/255.0;

    green = 0.0/255.0;

    blue = 0.0/255.0;

    [self SetClicked:self.btnBlack];

}

 

-(void) SetClicked:(UIButton *) btn

{

    [GeneralFunctions MakeSimpleButton:self.btnBlack];

    [GeneralFunctions MakeSimpleButton:self.btnRed];

    [GeneralFunctions MakeSimpleButton:self.btnYellow];

    [GeneralFunctions MakeSimpleButton:self.btnGreen];

    [GeneralFunctions MakeSelectedButton:btn];

}

 

- (IBAction)btnUndoClicked:(id)sender

{

    tempDrawImage.image = nil;

}

- (IBAction)btnSaveClicked:(id)sender

{

    if (tempDrawImage!=nil)

    {

        UIGraphicsBeginImageContext(mainImageView.frame.size);

        

        [mainImageView.image drawInRect:CGRectMake(0, 0, mainImageView.frame.size.width, mainImageView.frame.size.height) blendMode:kCGBlendModeNormal alpha:1.0];

        [tempDrawImage.image drawInRect:CGRectMake(0, 0, tempDrawImage.frame.size.width, tempDrawImage.frame.size.height) blendMode:kCGBlendModeNormal alpha:opacity];

        mainImageView.image = UIGraphicsGetImageFromCurrentImageContext();

        tempDrawImage.image = nil;

        UIGraphicsEndImageContext();

 

        //overwrite the picture in the picture library

        ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

        [library writeImageToSavedPhotosAlbum:mainImageView.image.CGImage orientation:(ALAssetOrientation)mainImageView.image.imageOrientation completionBlock:^(NSURL *assetURL, NSError *error )

         {

             if (self.pic)

             {

                 self.pic.picture_url = [NSString stringWithFormat:@"%@", assetURL];

                 [DBStore SaveContext];

             }

         }];

        [self.navigationController popViewControllerAnimated:YES];

    }

}

 

- (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

 

@end

 

Want to try this yourself, you could lose the Picture stuff, just provide the image to the view controller. Copy paste the code, with some easy fixes it should run perfectly. If needed, I could provide a demo project.


Tags: ,

iOS: UITextField in UICollectionView get behind keyboard.

by Mark Deraeve 15. May 2014 02:43

OK, I already posted a solution to move the view up when the keyboard shows so your textfield or view is not behind, but on top of the keyboard. 

Recently I had a similar problem, but this solution was not working exactly is I wanted. The problem was that when clicked in a textfield that was located in the top of the collection view, the field got moved out of screen. 

The first and easy part is moving the view up when the keyboard shows, just by implementing the solution found on all forums registering the keyboardwilshow and hide notifications:

- (void)viewWillAppear:(BOOL)animated

{

    // register for keyboard notifications

    [[NSNotificationCenterdefaultCenter] addObserver:self

                                             selector:@selector(keyboardWillShow)

                                                 name:UIKeyboardWillShowNotification

                                               object:nil];

    

    [[NSNotificationCenterdefaultCenter] addObserver:self

                                             selector:@selector(keyboardWillHide)

                                                 name:UIKeyboardWillHideNotification

                                               object:nil];

}

 

- (void)viewWillDisappear:(BOOL)animated

{

    // unregister for keyboard notifications while not visible.

    [[NSNotificationCenterdefaultCenter] removeObserver:self

                                                    name:UIKeyboardWillShowNotification

                                                  object:nil];

    

    [[NSNotificationCenterdefaultCenter] removeObserver:self

                                                    name:UIKeyboardWillHideNotification

                                                  object:nil];

 

}

These 2 selectors simply move the view up or down, I made the move up function general:

//method to move the view up/down whenever the keyboard is shown/dismissed

+(void)setViewMovedUp:(BOOL)movedUp AndView:(UIView *) vw

{

    int movementDistance = 80; // tweak as needed

    if ( UIInterfaceOrientationIsLandscape([[UIApplicationsharedApplication]statusBarOrientation]))

    {

        movementDistance = kOFFSET_FOR_KEYBOARDHOR;

    }

    else

    {

        movementDistance = kOFFSET_FOR_KEYBOARDVER;

    }

    const float movementDuration = 0.3f; // tweak as needed

    

    int movement = (movedUp ? -movementDistance : movementDistance);

    

    [UIViewbeginAnimations: @"anim"context: nil];

    [UIViewsetAnimationBeginsFromCurrentState: YES];

    [UIView setAnimationDuration: movementDuration];

    vw.frame = CGRectOffset(vw.frame, 0, movement);

    [UIViewcommitAnimations];

 

}

So this function is called when the keyboard moves up or down like this:

-(void)keyboardWillShow

{

    [GeneralFunctionssetViewMovedUp:YES AndView:self.view];

 

}

 

-(void)keyboardWillHide

{

    [GeneralFunctionssetViewMovedUp:NOAndView:self.view];

 

}

This already works, but will shift the top textfields out of screen:

 

When clicked on one of the top fields, you can see the field moving out of screen, I clicked in the textfield with text menu, it's out of screen after the keyboard shows:

Now how to solve this. I had to find out when clicked in the collection view in a textfield that would appear behind the keyboard if shown.

To solve this I made a delegate function in the cell view controller that would be called when the textfield edit did begin. 

-(void) collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath

{

    selectedIndexPath = indexPath;

}

 

-(void) EditDidBegin:(UICollectionViewCell *)cell

{

    NSIndexPath * path = [self.colTranslations indexPathForCell:cell];

    [self SetMove:path];

}

 

-(void) SetMove:(NSIndexPath *) indexPath

{

    UICollectionViewLayoutAttributes *attributes = [self.colTranslations layoutAttributesForItemAtIndexPath:indexPath];

    

    CGRect cellRect = attributes.frame;

    

    CGRect cellFrameInSuperview = [self.colTranslations convertRect:cellRect toView:[self.colTranslations superview]];

    

    NSLog(@"%f",cellFrameInSuperview.origin.y);

    if (cellFrameInSuperview.origin.y > kOFFSET_FOR_KEYBOARDHOR)

    {

        moveScreen=YES;

    }

    else

    {

        moveScreen=NO;

    }

 

}

 

So the function SetMove will calculate where clicked in the superview and chooses if the keyboard needs to be shifted up or not.

Just add these checks to the selectors of the keyboard will show and hide notifications and it will work:

-(void)keyboardWillShow

{

    if (moveScreen==YES)

    {

        [GeneralFunctionssetViewMovedUp:YESAndView:self.view];

        up=YES;

    }

    else

    {

        up=NO;

    }

}

 

-(void)keyboardWillHide

{

    if (moveScreen==YES && up==YES)

    {

        [GeneralFunctionssetViewMovedUp:NOAndView:self.view];

    }

 

}

Now do not forget to declare the bool 

bool moveScreen;

 

bool up;

 
And the result is this:

You see the Menu field that was clicked is still visible.

Now if I click in a field that is behind the keyboard:

The screen moves up!

If you hide the keyboard, the screen will get back in its original position.


Tags:

Using LINQ to concatinate an object property from a list of objects

by Mark Deraeve 7. May 2014 05:19

Just put this in a little demo to make it clear. I created a simple object Person, with ID, FirstName and LastName.

Now I fill a List with 3 persons (later I'll fill it with 20000 to do a performance check):

List<Person> persons = newList<Person>();

{

    newPerson(){ID=0, FirstName="Mark", LastName="Deraeve"},

    newPerson(){ID=1, FirstName="Priscilla", LastName="Lauwerijssen"},

    newPerson(){ID=2, FirstName="Anne-Lisa", LastName="Deraeve"}

};

Instead of looping over the list and concatinating it, like this:

start = DateTime.Now;

foreach (Person p in persons)

{

    sPersons = String.Format("{0},{1}", sPersons, p.FirstName);

}

//remove front ,

Console.WriteLine("With Loop: " + sPersons);

I can also just use 1 line to accomplisch this:

Console.WriteLine("With LINQ: " +string.Join(",", persons.Select(p => p.FirstName)));

Result:

 

Now let's say you do not want all records, this makes it even more easy, just put a Where before the Select and you got it!

Let's only show person named 'Deraeve':

Console.WriteLine("With LINQ: " +string.Join(",", persons.Where(p => p.LastName == "Deraeve").Select(p => p.FirstName)));

Result:

 

Now last, lets try to see performance difference. I'll fill the list with 20000 persons. This is where the power comes in. (The number 188889 or 188890(+1 for the extra comma) is the length of the result string)

 

Amazingly, the LINQ only uses 3 or 4 milliseconds, the old for loop takes 1-3 (There is a difference when using String.Format (slower) or just "string + ','+ "string") seconds. This can really make a big difference in today's apps.

So here the complete code so you can test it yourself:

Code of the console app:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace TestConsoleApp

{

    classProgram

    {

        staticvoid Main(string[] args)

        {

            List<Person> persons = newList<Person>();

            /*{

                new Person(){ID=0, FirstName="Mark", LastName="Deraeve"},

                new Person(){ID=1, FirstName="Priscilla", LastName="Lauwerijssen"},

                new Person(){ID=2, FirstName="Anne-Lisa", LastName="Deraeve"}

            };*/

 

            for (int i = 0; i < 20000; i++)

            {

                persons.Add(newPerson() { ID = i, FirstName = string.Format("Name{0}", i), LastName = "Deraeve" });

            }

 

            string sPersons="";

            DateTime start = DateTime.Now;

            TimeSpan ts;

 

            start = DateTime.Now;

            sPersons = string.Join(",", persons.Select(p => p.FirstName));

            ts = DateTime.Now.Subtract(start);

            Console.WriteLine("With LINQ: " + sPersons.Length);

            Console.WriteLine(String.Format("Seconds:{0} Miliseconds{1} ", ts.Seconds, ts.Milliseconds));

            Console.WriteLine("");

 

            sPersons = "";

 

            start = DateTime.Now;

            sPersons = string.Join(",", persons.Where(p => p.LastName == "Deraeve").Select(p => p.FirstName));

            ts = DateTime.Now.Subtract(start);

            Console.WriteLine("With LINQ and Where: " + sPersons.Length);

            Console.WriteLine(String.Format("Seconds:{0} Miliseconds{1} ", ts.Seconds, ts.Milliseconds));

            Console.WriteLine("");

 

            sPersons="";

 

            start = DateTime.Now;

            foreach (Person p in persons)

            {

                sPersons = String.Format("{0},{1}", sPersons, p.FirstName);

            }

            ts = DateTime.Now.Subtract(start);

 

            Console.WriteLine("With for loop: " + sPersons.Length);

            Console.WriteLine(String.Format("Seconds:{0} Miliseconds{1} ",ts.Seconds,ts.Milliseconds));

            Console.WriteLine("");

 

            sPersons = "";

 

            start = DateTime.Now;

            foreach (Person p in persons)

            {

                if (p.LastName == "Deraeve")

                {

                    sPersons = String.Format("{0},{1}", sPersons, p.FirstName);

                }

            }

 

            ts = DateTime.Now.Subtract(start);

 

            Console.WriteLine("With for loop and if: " + sPersons.Length);

            Console.WriteLine(String.Format("Seconds:{0} Miliseconds{1} ", ts.Seconds, ts.Milliseconds));

            Console.WriteLine("");

 

            sPersons = "";

 

            start = DateTime.Now;

            foreach (Person p in persons)

            {

                sPersons = sPersons + ',' + p.FirstName;

            }

            ts = DateTime.Now.Subtract(start);

 

            Console.WriteLine("With for loop without format: " + sPersons.Length);

            Console.WriteLine(String.Format("Seconds:{0} Miliseconds{1} ", ts.Seconds, ts.Milliseconds));

            Console.WriteLine("");

 

            Console.ReadKey();

        }

    }

}

Code of the Person class:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace TestConsoleApp

{

    publicclassPerson

    {

        publicstring FirstName { get; set; }

 

        publicstring LastName { get; set; }

 

        publicint ID { get; set; }

 

    }

}

Things even get better for the Join statement when we add the last name to the result:

sPersons = string.Join(",", persons.Where(p => p.LastName == "Deraeve").Select(p => p.FirstName + ' ' + p.LastName));

VS

foreach (Person p in persons)

{

    sPersons = String.Format("{0},{1} {2}", sPersons, p.FirstName, p.LastName);

}


Result: 



Tags:

|

First app in the App Store !!!

by Mark Deraeve 27. April 2014 22:23

Yesterday the Wiezer app got approved in the app store. For now only in Dutch, but I plan to release a multi language (English en Dutch) app with some improvements soon.

Here the first review of the app looking good! Check in AppStore!

First app is a special feeling, next would be a second app that could reach and interest the whole world.


Tags: ,

Wiezer

by Mark Deraeve 18. April 2014 00:15

Today I posted my first app in the app store. The process was relative easy. Now just wait until the app is reviewed. The manual on the small cards game assistant app can be found here!

 


Tags:

iOS: UITextView gets behind the keyboard

by Mark Deraeve 9. April 2014 05:23

Very annoying problem when you make a simple view with on the bottom a UITextView. Reading a lot of solutions involving using a UIScrollview, I kept looking for an easy solution. And I found it.

The solution involves implementing the UITextView's delegate and moving up or down the view when the editing starts or ends.

Because the UITextView view doesn't have sent events like the UITextField, we need to implement the UITextViewDelegate .

Do not forget to set the delegate outlet for the TextView.

 

The rest is almost as easy:

#define kOFFSET_FOR_KEYBOARD 160.0

 

 

-(void) textViewDidBeginEditing:(UITextView *)textView

{

    if ([textView isEqual:self.txtRemark])

    {

        //move the main view, so that the keyboard does not hide it.

        if  (self.view.frame.origin.y >= 0)

        {

            [selfsetViewMovedUp:YES];

        }

    }

}

 

-(void) textViewDidEndEditing:(UITextView *)textView

{

    if ([textView isEqual:self.txtRemark])

    {

        if (self.view.frame.origin.y < 0)

        {

            [self setViewMovedUp:NO];

        }

    }

}

//method to move the view up/down whenever the keyboard is shown/dismissed

-(void)setViewMovedUp:(BOOL)movedUp

{

    [UIViewbeginAnimations:nilcontext:NULL];

    [UIViewsetAnimationDuration:0.3]; // if you want to slide up the view

    

    CGRect rect = self.view.frame;

    if (movedUp)

    {

        // 1. move the view's origin up so that the text field that will be hidden come above the keyboard

        // 2. increase the size of the view so that the area behind the keyboard is covered up.

        rect.origin.y -= kOFFSET_FOR_KEYBOARD;

        rect.size.height += kOFFSET_FOR_KEYBOARD;

    }

    else

    {

        // revert back to the normal state.

        rect.origin.y += kOFFSET_FOR_KEYBOARD;

        rect.size.height -= kOFFSET_FOR_KEYBOARD;

    }

    self.view.frame = rect;

    

    [UIViewcommitAnimations];

}

 

We will edit the field remark:

After clicking in the field, the screen moves up:

When finished (by clicking the hide keyboard sign, or by editing another field, the screen moves down again.


Tags:

SAP: Adobe forms not printing the quantity set in VV32

by Mark Deraeve 28. March 2014 00:49

When printing PDF invoices or any other document in SAP, you need to give the correct output parameters.

My problem was that when I specified 3 as quantity (ANZAHL) as the number of copies to print. But everytime only 1 appeared.

At the end, the problem was solved by settings the number of copies to the NAST-ANZAHL parameter:

fp_outputparams-copies    = nast-anzal.

So the complete set of parameters looks like this:

IF gv_e_invoice EQ 'X'.

    fp_outputparams-preview       = 'X'.

    fp_outputparams-nodialog      = gv_e_invoice.

 

  ELSE.

    fp_outputparams-reqimm        = 'X'.

    fp_outputparams-preview       = 'X'.

    fp_outputparams-nodialog      = 'X'.

    fp_outputparams-copies    = nast-anzal.

  ENDIF.

 

  fp_outputparams-covtitle      = 'Invoice'.

  fp_outputparams-reqnew        = 'X'.

  fp_outputparams-reqfinal      = 'X'.

 

  IF NOT nast-ldest IS INITIAL.

    fp_outputparams-dest = nast-ldest.

  ELSE.

    fp_outputparams-dest          = 'LP01'.

  ENDIF.

 

  fp_outputparams-getpdf        = gv_e_invoice.

I have a difference when generating PDF for email. On our development system this did the trick.

But then on the QAS system it still ony printed 1 time. The solution to this couldn't be in the code, for it worked on development. It appeared to be a printer setting in SAP that wasn't correct. I had to set the Host Spool Access Method to C: Direct operating system call. 

 


Tags:

SAP: Program (IS_VARIANT-REPORT) not specified (SAP Message 0K522)

by Mark Deraeve 25. March 2014 06:55
I looked on the internet for a while, but couldn't find a solution that worked for me.
I noticed that when I used the transaction, this error came, but when I ran the program from SE383 it didn't gave any error.

So I looked myself for a short while and found out that it was the transaction I created that had a problem. I recreated the transaction using SE80. First I deleted the old transaction. Then I created the transaction following these steps:

1. Create the tranaction:

2. Select the second option from the list:

3. Then fill in the program behind the transaction and save.



I believe the mistake I did was the first time I created the transaction, I selected the first option in step 2.

Tags:

About the author

I started as a VB6 developer, programming all kinds of applications. I also got involved in the development of a e-market in ASP.

When .Net was introduced, I had the privilege to start in a team of professionals and develop a framework. I learned a lot and started to work as a c#.Net consultant from then on.

After 2 years I also got the chance to work for several months with Sharepoint. Sharepoint kept chasing me all the years after and when the product got more and more mature I started to love it. Now Sharepoint is a somewhat daily occupation for me. I implemented a large quality document management system at PMRL being the only developper/technical analyst. Working close togehter with the QA department we succeeded in making and improving a very good Quality document management system. Its used up until this day.

I worked for 6 years as a .Net consultant for 2 of the largest consultancy companies in Belgium. I mainly worked as a Sharepoint engineer, but also .Net expert and several ASP.Net and Windows applications. One of my last projects with the consultancy was creating a custom LIMS system. This was a succes and the customer asked me to stay and help to expand and maintain this LIMS. I had great years in this company. There was a focus on innovation and a lot of opportunities for improving and developping new IS systems. Apart from several small projects I further more improved the custom LIMS system, created a SOP library based on Sharepoint and a web based Skill matrix system to handle the skills of the employees in the company. 

Then I was involved in transferring the LIMS to a new lab in Singapore. This was done in a short time frame. The deployment was again a success and it passed the GLP inspection tests. I learned a lot from the Quality engineers about validation of computerized systems.

At my current job I have a wide range of challenges. Mainly I'm still working with .Net (VB.net and C#.Net). But outside of the Microsoft world I also do some ABAB programming in our SAP system. Like developing Adobe Forms and the program behind it. Or making small changes to customized code.

Latest I started to follow a course from Stanford Univercity on Objective C programming for IPAD and IPHONE.I just finished the first app for IPad and it appears to be a great succes. People in the factory are working with IPad to take pictures and upload them to orders. Already more and more projects are coming my way. The iOS apps are supported by a home made .Net architecture that exposes WCF services. Its working great. My second app is almost ready for deployment in factories. Now I started an App for the management team so they can manage projects on their IPAD and IPHONE.

My linkedIn!

Month List

Tag cloud

Locations of visitors to this page

Dailycode.info Dailycode.Info | Save a HTML page to File

Save a HTML page to File

by Mark Deraeve 30. May 2008 22:06

When I print a report, I create a html page that the user can print. Now, there was a need to backup these reports. So I had to find out how to save the html code to a file. The solution was very simple:

System.Net.WebClient client = null;
try
{
    client = new System.Net.WebClient();
    client.Encoding = System.Text.Encoding.UTF8;
    client.Headers = new System.Net.WebHeaderCollection();
    client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2;)");
    string url = Request.Url.ToString().Replace("administration","reports");
    url = url.Replace("reports.aspx", "reportprint.aspx?reportGuid=" + guid);
    //string html = client.DownloadString(url);
    string path = ConfigurationManager.AppSettings["ArchivePath"] + guid +".html";
    client.DownloadFile(url, path);
 
    
}
catch (Exception r) 
{
    HandleError(r);
}
finally
{
    client.Dispose();
}
 

The url string had to be the full url, no relative url's. So I took the url of the current page and replaced 2 parts of the url to make the correct url. The path where the report are saved is stored in the config file. 

All this worked fine until I deployed it to the server. Then I got this lovely error:

 The remote server returned an error: (401) Unauthorized.System.Net.WebException: The remote server returned an error: (401) Unauthorized. at System.Net.WebClient.DownloadFile(Uri address, String fileName) at System.Net.WebClient.DownloadFile(String address, String fileName) … 

The solution is simple, you need to pass credentials to the proxy. If the default credentials are ok, just set the usedefaultcredentials flag to true. The proxy will now detect the default credentials and use these. When your website is set to Use integrated windows authentication, then this the default credentials should pass your proxy and the problem should be solved.

 
System.Net.WebClient client = null;
try
{
    client = new System.Net.WebClient();
    client.Encoding = System.Text.Encoding.UTF8;
    client.Headers = new System.Net.WebHeaderCollection();
    client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2;)");
    client.UseDefaultCredentials = true;
    string url = Request.Url.ToString().Replace("administration","reports");
    url = url.Replace("reports.aspx", "reportprint.aspx?reportGuid=" + guid);
    //string html = client.DownloadString(url);
    string path = ConfigurationManager.AppSettings["ArchivePath"] + guid +".html";
    client.DownloadFile(url, path);
 
 
}
catch (Exception r) 
{
    HandleError(r);
}
finally
{
    client.Dispose();
}


Tags:

|

Comments (82) -

endangered animals
endangered animals
12/23/2010 10:38:57 PM #

when i came here i assumed it was going to be filled with obvious advice, but actually it turned out to be really useful. keep writing!

web hosting
web hosting
12/23/2010 11:13:19 PM #

Great Share!

tv online
tv online
12/24/2010 12:36:29 AM #

watch tv online - htt://www.tv-online-live.com

wild animals
wild animals
12/24/2010 6:38:17 AM #

when i stumbled upon this i figured it was going to be filled with boring info, but actually it turned out to be quite useful. keep writing!

Frank Mueller
Frank Mueller
12/24/2010 7:23:21 AM #

This weblog is superior it has acquired the whole points i sought after to communicate about, it has fulfilled my wisdom, i just appreciated this weblog and that i want to subscribe so can you please inform although your blog will get as much as date and what?s the procedure to subscribe in details.

Jocuri online
Jocuri online
12/24/2010 6:18:52 PM #

Wow!, this was a top quality post. In theory I’d like to write like this too – taking time and real effort to make a good article… but what can I say… I keep putting it off and never seem to achieve anything.

Las Vegas Web Marketing
Las Vegas Web Marketing
12/24/2010 11:56:32 PM #

Amazing freakin blog here. I almost cried while reading it!

Buy Backlinks
Buy Backlinks
12/25/2010 4:11:10 AM #

High quality info here! Keep up the great work. I love the feelings being expressed.

Wanetta Abbington
Wanetta Abbington
12/25/2010 8:37:08 AM #

The difficulty using Plr blog posts and articles is the fact buyers fail to apply it appropriately.  They should either make use of it for getting tips for things to write about or maybe totally re-write it or " spin " it up and later place their own identify onto it.

Financial Services
Financial Services
12/25/2010 10:00:52 AM #

Interesting layout on your blog. I really enjoyed reading it and also I will be back to read more in the future.

Top seo company
Top seo company
12/25/2010 6:47:37 PM #

Howdy, i read your blog occasionally and i own a similar one and i was just wondering if you get a lot of spam comments? If so how do you prevent it, any plugin or anything you can advise? I get so much lately it's driving me mad so any assistance is very much appreciated.

tattoos fonts
tattoos fonts
12/26/2010 8:09:39 AM #

you got some great ideas there. I did a search on the issue and learnt most peoples will agree with your blog. If you are an experienced traveler, you may know the ins and outs of travel to all parts of the world, and you may have very specific ideas about what you want to see and where you want to go.

filmy online
filmy online
12/26/2010 12:08:54 PM #

What about Dina G? BTW,Page Bookmarked

Call Center Jobs
Call Center Jobs
12/26/2010 1:35:26 PM #

Hey how are you doing? I just wanted to stop by and say that it's been a pleasure reading your blog. I have bookmarked your website so that I can come back & read more in the future as well. plz do keep up the quality writing

order cheap plavix
order cheap plavix
12/26/2010 4:44:08 PM #

Between me and my husband we've owned more MP3 players over the years than I can count, including Sansas, iRivers, iPods (classic & touch), the Ibiza Rhapsody, etc. But, the last few years I've settled down to one line of players. Why? Because I was happy to discover how well-designed and fun to use the underappreciated (and widely mocked) Zunes are.

Forest Mcmeen
Forest Mcmeen
12/26/2010 8:14:29 PM #

I have come back to your website serveral times. The additional articles are very fascinating and out of the ordinary. I wanted to signup for your rss feed,  so I can keep up to date of your latest articles.

sms blast
sms blast
12/27/2010 4:41:51 AM #

Excellent blog! I actually love how it is easy on my eyes and also the data are well written. I am wondering how I might be notified whenever a new post has been made. I have subscribed to your rss feed which must do the trick! Have a nice day!

Clogged Drain Repair Tyler TX
Clogged Drain Repair Tyler TX
12/27/2010 7:20:17 AM #

I agree with your thoughts here and I really love your blog! I've bookmarked it so that I can come back & read more in the future.

tattoo fonts for men
tattoo fonts for men
12/27/2010 10:11:07 AM #

I really loved reading your blog. It was very well written and simple to undertand. Unlike additional blogs I have read. I also found it very interesting. In fact after reading, I had to go show the spouse and she ejoyed it as well!

find address from cell phone number
find address from cell phone number
12/27/2010 9:04:38 PM #

It is by far the most relevant and up to date information I came across on this subject. Absolutely pleased that I came across your web page by chance. I’ll be subscribing to your site so that I can get the newest news. Thanks for all the knowledge here.

how to get rid of acne over night
how to get rid of acne over night
12/27/2010 10:48:28 PM #

I have looked over your site articles, it is especially worth of noteand informative. I have book marked your website and will revisit repeatedlyto study more of your site.

free rewards points
free rewards points
12/28/2010 5:23:59 AM #

cool u hit it 0n the dot will submit to reddit

best e cigarette
best e cigarette
12/28/2010 1:35:26 PM #

170. I quit this time (3rd attempt) on April 1st due to US federal and state tax increases on cigarettes. I just couldn't afford it any more. I also started working out in order to keep from gaining weight. By May 1st, I still gained 10 pounds and was just as irritable as the previous times that I quit. That's when I found out about and purchased my e-cigarettes. I've lost the 10 pounds and and am no longer irritable. I'm also still working out.

Vacanze In Italia
Vacanze In Italia
12/28/2010 8:53:52 PM #

Amazing freakin blog here. I almost cried while reading it!

Video Game Release Dates
Video Game Release Dates
12/29/2010 2:35:12 AM #

Great post! I'm surely sharing this with my friends! Had fun reading it indeed.

Nikki Watkins
Nikki Watkins
12/29/2010 3:04:57 AM #

I have read many blogs and found good and informatics but this blog has simply thrill me with it designs, colour combination and the most important thing real information. I have found only genuine and useful information on this blog.

Video Game Release Dates
Video Game Release Dates
12/29/2010 3:55:40 AM #

Great post! I'm surely sharing this with my friends! Had fun reading it indeed.

Video Game Release Dates
Video Game Release Dates
12/29/2010 3:57:42 AM #

Great post! I'm surely sharing this with my friends! Had fun reading it indeed.

Video Game Release Dates
Video Game Release Dates
12/29/2010 3:58:36 AM #

Great post! I'm surely sharing this with my friends! Had fun reading it indeed.

Video Game Release Dates
Video Game Release Dates
12/29/2010 3:59:36 AM #

Great post! I'm surely sharing this with my friends! Had fun reading it indeed.

Video Game Release Dates
Video Game Release Dates
12/29/2010 4:00:54 AM #

Great post! I'm surely sharing this with my friends! Had fun reading it indeed.

Black Magic Spells
Black Magic Spells
12/29/2010 4:51:22 AM #

FCC to vote on 'net neutrality' The Federal Communications Commission is set to vote Tuesday on set of regulations desi

Seo Services
Seo Services
12/29/2010 7:04:22 AM #

I would like to start my own blog one day. This was a really nice blog that you made here. Keep up the success Tong

web hosting
web hosting
12/29/2010 8:57:27 AM #

just check this: http://www.hostbyweb.com

add a link
add a link
12/29/2010 3:55:32 PM #

There are only few ways to can learn this.

Backlinks
Backlinks
12/29/2010 4:47:14 PM #

I would like to know more about how you can work this to make money online.  It seems like a lot of the things about making money and capitalizing on these types of ideas is so basic that everybody is doing it, and really the only people making riches from it are folks advertising the instructions.  Can you do a blog post about how you use this to actually make money?

stuff for free
stuff for free
12/29/2010 6:26:12 PM #

very nice blog, keep it up, will share this to others.

add a link
add a link
12/29/2010 9:20:19 PM #

What about social bookmarking?

Filmy Online
Filmy Online
12/29/2010 11:00:52 PM #

And how you can do social bookmarking?

Backlinks
Backlinks
12/29/2010 11:53:37 PM #

Related articles regarding this do not provide near as much information, heck you generally have to pay to look at information similar to this HAHA!  Thanks so much for your donations to this blog, you make it worth reading.  I'll be back tomorrow!\

Hypercom T7Plus Manual
Hypercom T7Plus Manual
12/30/2010 12:57:44 AM #

Do you like running Blog Engine?  If I might --perhaps you should consider adding a few images.  I dont mean to disrespect what you've done; its very good, for sure.  However, I think would respond to it more positively if you could add something animated to your postings.  Keep it up, but put a little more into it next time.

videos women giving birth
videos women giving birth
12/30/2010 4:25:38 AM #

You should wite a blog post about a recommendation of websites like Dailycode.Info | Save a HTML page to File. I came across your blog two days ago when I was googling, however I am not really into the blog thing. I don't think it's because I do not enjoy blogs, but more than likely due to the fact that I'm a little ignorant to them.  But blogengine is cool.

cheap air max 2009
cheap air max 2009
12/30/2010 9:48:32 AM #

I can not believe that your opinions on this topic are so close to mine. Thank you for sharing it which make me more confidence on my stand.

Black Magic Spells
Black Magic Spells
12/30/2010 2:01:50 PM #

If a lender gives a mortgage with a payment triple a borrower’s income, who do we blame the foreclosure on? Here&amp;

pozycjonowanie stron www
pozycjonowanie stron www
12/30/2010 5:21:24 PM #

It is truely nice post, but I do not see everything completely clear, especially for someone not involved in that topic. Anyway very interesting to me.

P1664 Ford
P1664 Ford
12/30/2010 6:51:25 PM #

After a jiffy, regular commenters begin to create a community. It starts to feel intrusive to insert yourself.

Ddene Pauley
Ddene Pauley
12/31/2010 2:17:39 AM #

Hi Sir, I was quite surprised by your blog, could you give me your contact email? I would like to discuss something. Thanks.

tattoo fonts script
tattoo fonts script
12/31/2010 4:58:59 AM #

Do you folks have a fb fan web page? I seemed for one on twitter however could not uncover one, I would like to become a fan!

SEO Agency
SEO Agency
12/31/2010 7:11:39 AM #

Really nice post! Your writing is so refreshing in comparison to most other bloggers. Thanks for writing when you do, I'll be sure to read more!

games for wii fit
games for wii fit
12/31/2010 10:42:01 AM #

Any existing pretty good Nintendo wii gaming console video games?  I was thinking if anyone have any kind of solutions? I am just thinking about selling my Nintendo wii and using the bucks to get new Xbox 360 Console games or maybe a Ps3... It occurred to me i always use my Nintendo wii console much more to play my older Nintendo gamecube when i previously own a Nintendo gamecube, funny !. So if anybody can tell me some terrific Nintendo wii games  I'd be interested to check out if they are good enough that I'll hold my own Wii. Thank you.

web hosting
web hosting
12/31/2010 12:55:15 PM #

just check this: http://www.hostbyweb.com

college grants
college grants
12/31/2010 3:47:20 PM #

You are a very bright person!

Black Magic Spells
Black Magic Spells
12/31/2010 6:49:26 PM #

What’s The Best Legitimate Way To Make Money Online Working From Home ?: I’m not interested in online MLM or netwo

tv online
tv online
12/31/2010 7:34:43 PM #

I wanna recomand you a nice website to watch your favorites tv channels online: http://www.tv-online-live.com

best linux distro
best linux distro
12/31/2010 11:15:35 PM #

very interesting info  ! .

Aion accounts
Aion accounts
12/31/2010 11:27:10 PM #

This is a really good read for me, Must admit that you are one of the best bloggers I ever saw.Thanks for posting this informative article.

free online porn
free online porn
1/1/2011 1:37:24 AM #

Usually I don’t post on blogs, but I need to say that this write-up really forced me to complete so! Thanks, extremely nice article.

Magic Submitter
Magic Submitter
1/1/2011 1:51:24 AM #

Need a Marketing Manager ?If you are serious about growing your profits,there is not a single tool available that is more powerful and effective than Magic Submitter <a href="http://marketing.singledad.de">Ultimate Marketing Tool - Video</a>

Marketing Software
Marketing Software
1/1/2011 2:17:07 AM #

Managing your Marketing Campaign.It automatically submits it to Video Sites, Photo Sites, Blogs, Micro Blogs, Bookmarking Sites, RSS Feeds,Press Release Sites, and dozens more.<a href="singledad.de/businesspromoting">Marketing Tools</a>

Magic Submitter
Magic Submitter
1/1/2011 2:17:39 AM #

Your Marketing Manager.It gives you more free traffic at the push of a button, I was completely blown away by it.This thing is so cool. <a href="http://goo.gl/maps/eaZ8">Marketing Software</a>

download youtube
download youtube
1/1/2011 2:25:59 AM #

Have you tried freecorder before for downloading youtube?  If so - got any feedback? Would love to hear your review.

tera patrick blow job
tera patrick blow job
1/1/2011 3:50:56 PM #

I have studied a few of the articles on your blog, and I genuinely like your style of writing. I added it to my bookmarks blog site directory and will be coming back in the near future.

la gazzetta dello sport
la gazzetta dello sport
1/1/2011 7:46:44 PM #

What about social bookmarking?

casino online
casino online
1/2/2011 2:00:54 AM #

Hi, I just found your blog - thanks for the good work. Just wanted to let you know that it's not displaying correctly on the BlackBerry Browser (I have a Bold). Either way, I am now on the RSS feed on my home PC, so thanks again!

Sohbet
Sohbet
1/2/2011 3:00:01 AM #

If you're still on the fence: grab your favorite earphones, head down to a Best Buy and ask to plug them into a Zune then an iPod and see which one sounds better to you, and which interface makes you smile more. Then you'll know which is right for you.

Casandra Nurnberger
Casandra Nurnberger
1/2/2011 3:27:01 AM #

"This web site is really a walk-through for all of the info you wanted about"

online casino
online casino
1/2/2011 3:43:14 AM #

Hi. I read a few of your other posts and wanted to know if you would be interested in exchanging blogroll links?

casino online
casino online
1/2/2011 3:44:34 AM #

Hi, interesting post. I have been pondering this issue,so thanks for posting. I will visit your blog again

online casino
online casino
1/2/2011 3:46:08 AM #

I just wanted to take a minute to say thanks for posting this. This area was on my mind recently, as a result I sincerely loved this article!

casino online
casino online
1/2/2011 3:47:55 AM #

Hi, interesting post. I have been pondering this issue,so thanks for posting. I will visit your blog again

online casino
online casino
1/2/2011 3:50:26 AM #

I was very pleased to find this site.I wanted to thank you for this great read!! I definitely enjoying every little bit of it and I have you bookmarked to check out new stuff you post.

Link Building
Link Building
1/2/2011 4:46:53 AM #

This is the best blog I've ever seen in my life! I really appreciate you taking the time out of your busy day to share your this with everyone.

Sohbet
Sohbet
1/2/2011 5:25:12 AM #

Between me and my husband we've owned more MP3 players over the years than I can count, including Sansas, iRivers, iPods (classic & touch), the Ibiza Rhapsody, etc. But, the last few years I've settled down to one line of players. Why? Because I was happy to discover how well-designed and fun to use the underappreciated (and widely mocked) Zunes are.

Sohbet
Sohbet
1/2/2011 5:27:05 AM #

Sorry for the huge review, but I'm really loving the new Zune, and hope this, as well as the excellent reviews some other people have written, will help you decide if it's the right choice for you.

Sohbet
Sohbet
1/2/2011 5:29:24 AM #

Sorry for the huge review, but I'm really loving the new Zune, and hope this, as well as the excellent reviews some other people have written, will help you decide if it's the right choice for you.

Sohbet
Sohbet
1/2/2011 5:31:59 AM #

Zune and iPod: Most people compare the Zune to the Touch, but after seeing how slim and surprisingly small and light it is, I consider it to be a rather unique hybrid that combines qualities of both the Touch and the Nano. It's very colorful and lovely OLED screen is slightly smaller than the touch screen, but the player itself feels quite a bit smaller and lighter. It weighs about 2/3 as much, and is noticeably smaller in width and height, while being just a hair thicker.

Jack Crummie
Jack Crummie
1/2/2011 5:34:13 AM #

"you’re not the average blog author, man"

Sohbet
Sohbet
1/2/2011 5:35:49 AM #

If you're still on the fence: grab your favorite earphones, head down to a Best Buy and ask to plug them into a Zune then an iPod and see which one sounds better to you, and which interface makes you smile more. Then you'll know which is right for you.

Elnora Holmes
Elnora Holmes
1/2/2011 7:28:26 PM #

If you are short on initial funds, investing in domains can generate real and serious returns. Having sold many .com's for very good 5 figures, I know the market inside and out. It's tough out there, but the returns are there if you are careful and know what to look for.

Backlinks
Backlinks
1/2/2011 11:15:03 PM #

I agree with your thoughts here and I really love your blog! I've bookmarked it so that I can come back & read more in the future.

tori black pic
tori black pic
1/3/2011 1:02:13 AM #

I have studied a few of the articles on your blog, and I genuinely like your style of writing. I added it to my bookmarks blog site directory and will be coming back in the near future.

million hits secret
million hits secret United States
8/9/2014 11:44:18 AM #

You completed various fine points there. I did a search on the topic and found a good number of folks will go along with with your blog.

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading

About the author

I started as a VB6 developer, programming all kinds of applications. I also got involved in the development of a e-market in ASP.

When .Net was introduced, I had the privilege to start in a team of professionals and develop a framework. I learned a lot and started to work as a c#.Net consultant from then on.

After 2 years I also got the chance to work for several months with Sharepoint. Sharepoint kept chasing me all the years after and when the product got more and more mature I started to love it. Now Sharepoint is a somewhat daily occupation for me. I implemented a large quality document management system at PMRL being the only developper/technical analyst. Working close togehter with the QA department we succeeded in making and improving a very good Quality document management system. Its used up until this day.

I worked for 6 years as a .Net consultant for 2 of the largest consultancy companies in Belgium. I mainly worked as a Sharepoint engineer, but also .Net expert and several ASP.Net and Windows applications. One of my last projects with the consultancy was creating a custom LIMS system. This was a succes and the customer asked me to stay and help to expand and maintain this LIMS. I had great years in this company. There was a focus on innovation and a lot of opportunities for improving and developping new IS systems. Apart from several small projects I further more improved the custom LIMS system, created a SOP library based on Sharepoint and a web based Skill matrix system to handle the skills of the employees in the company. 

Then I was involved in transferring the LIMS to a new lab in Singapore. This was done in a short time frame. The deployment was again a success and it passed the GLP inspection tests. I learned a lot from the Quality engineers about validation of computerized systems.

At my current job I have a wide range of challenges. Mainly I'm still working with .Net (VB.net and C#.Net). But outside of the Microsoft world I also do some ABAB programming in our SAP system. Like developing Adobe Forms and the program behind it. Or making small changes to customized code.

Latest I started to follow a course from Stanford Univercity on Objective C programming for IPAD and IPHONE.I just finished the first app for IPad and it appears to be a great succes. People in the factory are working with IPad to take pictures and upload them to orders. Already more and more projects are coming my way. The iOS apps are supported by a home made .Net architecture that exposes WCF services. Its working great. My second app is almost ready for deployment in factories. Now I started an App for the management team so they can manage projects on their IPAD and IPHONE.

My linkedIn!

Month List

Tag cloud

Locations of visitors to this page