Feeds:
Posts
Comments

Untuk menghapus Aplikasi Mac Office gunakan “Remove Office” tools di Application > Microsoft Office > Additional Tools > Remove Office

Setelah melakukan Remove Office ini, apabila kita re-install Mac Office lagi dengan versi yang sama, maka Mac Office masih mendeteksi product key dari Mac Office sebelumnya. Untuk benar-benar full-reinstall termasuk memasukkan product key baru, maka bisa dilakukan dengan menghapus 2 file sebagai berikut :
~/Library/Preferences/Microsoft/Office 2008/Microsoft Office 2008 Settings.plist
/Applications/Microsoft Office 2008/Office/OfficePID.plist

Ok selamat menikmati Clean Mac Office!

Aku mempunyai MAMP Pro sudah sudah jalan stabil di Mac Tiger, termasuk MySQL, PhpMyAdmin dan Apache. Aku mencoba memasang Navicat Premium sebagai MySQL GUI. Tetapi muncul masalah, setiap kali mencoba melakukan koneksi ke MySQL di localhost selalu gagal (Can’t connect bla bla…) tetapi kalau digunakan untuk melakukan koneksi ke MySQL ke Server Linux berhasil.

Setelah browsing dan mencoba-coba, solusi yang bisa dilakukan dengan cara menggunakan socket file untuk koneksi ke localhost.

Setting di Navicatnya sebagai berikut :

Masuk ke Connection Properties-nya Navicat, klik Tab Advanced, pilih option “Use socket file for localhost connection” dan arahkan Socket File Path = /Applications/MAMP/tmp/mysql/mysql.sock

Dan tentunya lengkapi juga setting User-Password di General Tab.

VbCrLf di PHP

simple script untuk replace [new line - enter] menjadi <br> di PHP :

$tampil = preg_replace(‘/(\r\n|\n|\r|\f)/U’, “<br />”, $text);

example :

<?php

$t = $_POST['test'];

$tampil = preg_replace(‘/(\r\n|\n|\r|\f)/U’, “<br />”, $t);
echo ‘test : ‘. $tampil;

?>
<html>
<head>
<title>test</title>
</head>
<body>

<form name=”test” method=”post” action=”test.php”>
ini inputnya : <br>
<textarea name=”test” rows=”20″ cols=”80″></textarea><br>
<input type=”submit” value=”submit” name=”submit”><br><br><br>
</form>

ini hasilnya : <br>
<textarea name=”test2″ rows=”20″ cols=”80″><?=$tampil?></textarea><br>
</body>
</html>

Windows server 2000/2003 allows two remote terminal services connections for administrative purposes. Every once in a while I’ll get the “You exceeded the allowed connection count” message when trying to connect to a server via RDP, because previous sessions were not disconnected correctly. You can use either of the following methods to remotely disconnect Terminal Server sessions. Method 1 You can normally run the Terminal Services Manager program on another server, or even from a Windows XP workstation, to disconnect Terminal Services connections by clicking Start – Run and then typing %SystemRoot%\system32\tsadmin.exe This will launch the local copy of Terminal Services Manager. Next right click on All Listed Servers and select Connect to Computer. Type in the name or IP address of the server you wish to manage.

DECLARE @name VARCHAR(50) -- database name
DECLARE @path VARCHAR(256) -- path for backup files
DECLARE @fileName VARCHAR(256) -- filename for backup
DECLARE @fileDate VARCHAR(20) -- used for file name

SET @path = 'C:\Backup\'

SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112)

DECLARE db_cursor CURSOR FOR
SELECT name
FROM master.dbo.sysdatabases
WHERE name NOT IN ('master','model','msdb','tempdb')

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name

WHILE @@FETCH_STATUS = 0
BEGIN
SET @fileName = @path + @name + '_' + @fileDate + '.BAK'
BACKUP DATABASE @name TO DISK = @fileName

FETCH NEXT FROM db_cursor INTO @name
END

CLOSE db_cursor
DEALLOCATE db_cursor

1. Functions Introduction

This section gives examples of all functions that are available in the Mckoi database software. Functions may be used within all expressions except aggregate functions that may only be used within the SELECT .... FROM clause.


2. Mathematical Functions

Follows are all the mathematical functions available in Mckoi Database. Note that some of these functions may lose precision because the number could be cast to a ‘double’. You can assume that all mathematical functions have at worst the precision of a ‘double’.

ABS(number)

Returns the absolute value of a number.

Examples:

     SELECT ABS(-0.94)
==>  0.94
     SELECT ABS(9 - 200)
==>  191

SIGN(number)

Returns 1 if the number is positive, -1 if the number is negative and 0 if the number is zero.

Examples:

     SELECT SIGN(40)
==>  1
     SELECT SIGN(-40)
==>  -1
     SELECT SIGN(40 - 40)
==>  0

MOD(number1, number2)

Returns the modulo of number1 and number2 (equivalent to {number1 % number2} in Java).

Examples:

     SELECT MOD(15, 5)
==>  0
     SELECT MOD(33, 10)
==>  3
     SELECT ROUND(552 / 10), MOD(552, 10)
==>  55, 2

ROUND(number, decimal_places)
ROUND(number)

Rounds the number to ‘n’ decimal places. When no ‘decimal_places’ argument is provided the number is rounded to the nearest whole number.

This will round up if the fraction to the right is >= .5 otherwise it rounds down. This uses the {BigDecimal.setScale(decimal_places, BigDecimal.ROUND_HALF_UP)} method for rounding.

Examples:

     SELECT ROUND((943 * 13) / 99, 3)
==>  123.828
     SELECT ROUND((943 * 13) / 99, 2)
==>  123.83
     SELECT ROUND((943 * 13) / 99)
==>  124

POW(number1, number2)

Raises number1 to the power of number2.

Examples:

     SELECT POW(9, 6)
==>  531441
     SELECT POW(2, 32)
==>  4294967296
     SELECT POW(2, 64)
==>  18446744073709551616
     SELECT POW(2, -3)
==>  0.125

SQRT(number)

Finds the square root of the number argument.

Examples:

     SELECT SQRT(65536)
==>  256
     SELECT SQRT(-1)
==>  NULL

LEAST(val1, val2, …)

This function accepts any number of arguments and returns the value that represents the least value of the set.

Examples:

     SELECT LEAST(4)
==>  4
     SELECT LEAST(90, 9.125, 3, 75)
==>  3
     SELECT LEAST('H', 'Z', 'B')
==>  B
     SELECT LEAST(10 / 3, 10 * 3,
                  POW(10, 3), MOD(10, 3))
==>  1

GREATEST(val1, val2, …)

This function accepts any number of arguments and returns the value that represents the greatest value of the set.

Examples:

     SELECT GREATEST(4)
==>  4
     SELECT GREATEST(90, 9.125, 3, 75)
==>  90
     SELECT GREATEST('H', 'Z', 'B')
==>  Z
     SELECT GREATEST(10 / 3, 10 * 3,
                     POW(10, 3), MOD(10, 3))
==>  1000


3. String Functions

String functions in Mckoi Database mostly map to equivalent functions found within java.lang.String.

LOWER(str)

Returns a lower case version of the string literal argument.

Examples:

     SELECT LOWER('THis is sOME TEXT')
==>  this is some text

UPPER(str)

Returns an upper case version of the string literal argument.

Examples:

     SELECT UPPER('THis is sOME TEXT')
==>  THIS IS SOME TEXT

CONCAT(str1, str2, …)

Returns the concatenation of the string arguments. This function can take any number of arguments.

Examples:

     SELECT CONCAT('This i', 's some text', '.')
==>  This is some text.
     SELECT CONCAT('-', 0.95)
==>  -0.95

LENGTH(str)

Returns the number of characters in the string argument.

NOTE: This may additionally be used on BLOB data to return the count of bytes in the BLOB.

Examples:

     SELECT LENGTH('This is some text')
==>  17
     SELECT LENGTH(0.544)
==>  5
     SELECT LENGTH('    Test')
==>  8

TRIM( [ [ LEADING | TRAILING | BOTH ] [ characters ] FROM ] str )
LTRIM(str)
RTRIM(str)

Trims characters from a string argument. The LTRIM and RTRIM form trim whitespace from the left and right of the string respectively.

Examples:

     SELECT TRIM(TRAILING 'a' FROM 'aaabcdaaa')
==>  aaabcd
     SELECT TRIM(LEADING 'a' FROM 'aaabcdaaa')
==>  bcdaaa
     SELECT TRIM('ab' FROM 'ababzzzzab')
==>  zzzz
     SELECT TRIM('  a string message ')
==>  a string message

SUBSTRING(str, start_index)
SUBSTRING(str, start_index, length)

Returns a substring of a string. The SUBSTRING function complies with the SQL specification. The start_index parameter is a value between 1 and the length of the string where 1 includes the first character, 2 includes the second character, etc. The length parameter represents the size of the substring.

Examples:

     SELECT SUBSTRING('Tobias Downer', 8)
==>  Downer
     SELECT SUBSTRING('abcd', 1, 2)
==>  ab
     SELECT SUBSTRING('abcd', 3, 4)
==>  cd
     SELECT SUBSTRING('abcd', 3, 5000)
==>  cd
     SELECT SUBSTRING('abcd', 0, 5000)
==>  abcd
     SELECT SUBSTRING('abcd', 1, 0)
==>  (string of 0 length)


4. Aggregate Functions

Aggregate functions can only operate within a group of a SELECT statement. They are used to compute statistics over a set of records.

COUNT(*)
COUNT(DISTINCT expression_list)
COUNT(column_name)
COUNT(expression)

The * version of this function returns the total number of rows in the group. If a column name is specified it returns the number of non-null values in the group. The ‘expression’ form of this function evaluates the expression for each row in the group and counts it only if it evaluates to NULL. COUNT(DISTINCT ... ) counts all distinct values of the expression list over the group.

Examples:

     SELECT COUNT(*)
       FROM Orders
     SELECT COUNT(*)
       FROM Orders
   GROUP BY division
     SELECT COUNT(id)
       FROM Orders
   GROUP BY division
     SELECT last_name, COUNT(DISTINCT last_name)
       FROM Customers
   GROUP BY age

SUM(column_name)
SUM(expression)

Calculates the sum of all values in a column/expression over a group. The expression form of this function is evaluated for each row in the group.

Examples:

     SELECT SUM(value) FROM Orders
     SELECT SUM(quantity * value)
       FROM Orders
     SELECT SUM(quantity * value) * 0.75
       FROM Orders
   GROUP BY division

AVG(column_name)
AVG(expression)

Calculates the average of the column/expression over the group. The expression form of this function is evaluated for each row in the group.

Examples:

     SELECT AVG(value) FROM Orders
     SELECT AVG(quantity * value)
       FROM Orders
     SELECT AVG(quantity * value) * 0.75
       FROM Orders
   GROUP BY division

MIN(column_name)
MIN(expression)

Finds the minimum value of a column/expression over a group.

Examples:

     SELECT MIN(value) FROM Orders
     SELECT MIN(quantity * value)
       FROM Orders
     SELECT MIN(quantity * value) * 0.75
       FROM Orders
   GROUP BY division

MAX(column_name)
MAX(expression)

Finds the maximum value of a column/expression over a group.

Examples:

     SELECT MAX(value) FROM Orders
     SELECT MAX(quantity * value)
       FROM Orders
     SELECT MAX(quantity * value) * 0.75
       FROM Orders
   GROUP BY division


5. Security Functions

Functions that provide security information about the session performing the query.

USER()

Returns the current user.

PRIVGROUPS()

Returns a comma deliminated list of priv groups the user belongs to. A user may belong to any number of groups which dictate the tables a user may access.


6. Branch Functions

IF(condition_expr, true_expr, false_expr)

If the first expression (condition_expr) evaluates to true this function returns the result of ‘true_expr’ otherwise returns the result of ‘false_exp’.

Examples:

     SELECT IF(true, 5, 8)
==>  5
     SELECT IF(false, 5, 8)
==>  8
     SELECT IF(NULL, 5, 8)
==>  NULL
     SELECT IF(true, IF(false, 1, 2), 3)
==>  2
     SELECT IF(col1 = 0, 'N/A', col1) FROM MyTable

COALESCE(expr1, expr2, expr3, ….)

Returns the first non null value from the parameters or null if the entire list contains null values.

Examples:

     SELECT COALESCE(NULL, 'a')
==>  a
     SELECT COALESCE(NULL, NULL, NULL)
==>  NULL
     SELECT COALESCE(col1, 'N/A') FROM MyTable


7. Date/Time Functions

DATEOB(date_string)

Parses a string to a Date object that can be used on queries against TIMESTAMP / DATE / TIME columns. DATEOB with no arguments returns the current time of the machine running the database.

Since version 0.92 this function has been deprecated. Use the standard DATE, TIME and TIMESTAMP literals specified in SQL-92 instead.

Examples:

     SELECT DATEOB()
==>  Wed Aug 09 11:49:31 EDT 2000
     SELECT DATEOB('Aug 1, 2000')
==>  Tue Aug 01 00:00:00 EDT 2000
     SELECT number FROM Orders
      WHERE date_made >= DATEOB('Jan 1, 2000')


8. Misc Functions

UNIQUEKEY(table_name)

Returns a unique key for the given table name. This is an atomic operation that is guaranteed to return a unique number each call. It should be used to generate unique identification numbers for records. It is similar to the AUTO_INCREMENT feature of other database systems.

Examples:

     SELECT UNIQUEKEY('Orders')
     INSERT INTO Orders
        ( id, number, division, date_made, quantity,
          value )
       VALUES
        ( UNIQUEKEY('Orders'), CONCAT('Order-', id),
          'Bio Engineering', DATEOB(), 25, 1900.00 )

TONUMBER(expression)

Attempts to cast the expression to a number. If the expression is a boolean then this function will return 1 for true or 0 for false. If the expression is a String then it attempts to parse the string into a number. If the expression is a Date then it returns the date as the number of milliseconds since Jan 1st, 1970.

Examples:

     SELECT TONUMBER(DATEOB('Aug 1, 2000'))
==>  965102400000

I recently retooled a Zend development environment on a mac laptop running OS X. I had been using the free version of MAMP for awhile but found the free version too limited.  MAMP is useful for getting  Apache, PHP, and MySQL stack up and working together quickly on a mac.  One thing lacking in MAMP though is an actual http.conf file like you probably deal with on a production server.

XAMP is another free AMP stack which includes an editable httpd.conf file making configuring Apache to test SSL connections much more standardized if not straight forward.  Instead of dealing with a GUI one deals with the Apache configuration files directly.  While it’s nice to be able to customize XAMPs Apache installation getting the configuration right can take some time.  If your really uncomfortable meddling with Apache configuration files you should consider just purchasing a licensed version of MAMP which does most of the stuff through a graphical interface.  Of course once you go into production you’ll probably going to have to deal with Apache’s httpd.conf file anyway so you might as well front load the pain now and be better prepared when things actually do go into production.

So without further ado I now present the first post on the new acwolf blog: how to configure XAMP virtual hosts on a mac.

Step One, Download and configure XAMP

First download XAMP for mac.

Once you have XAMP running on you mac you’re ready to begin configuring virtual hosts.  Using Mac Finder go to Applications > xampp > etc and open the httpd.conf file. Near the bottom of the file look for the following lines:

# Virtual hosts
#Include /Applications/xampp/etc/extra/httpd-vhosts.conf

The pound symbol (#) denotes a comment.  Since we want to setup virtual hosts go ahead and uncomment the second line by removing the pound symbol like so

# Virtual hosts
Include /Applications/xampp/etc/extra/httpd-vhosts.conf

With the above line uncommented Apache will now look to the httpd-vhosts.conf file for instructions on how to configure virtual hosts.   Go to Applications > xampp > etc > extra and open httpd-vhosts.conf to begin configuring virtual hosts for XAMP.  An imported (and practically undocumented) fist step is to include localhost has the default named virtual host. Do this by adding the following to the httpd-vhosts.conf:

<VirtualHost *:80>
ServerName localhost
DocumentRoot “/Applications/xampp/htdocs”
<Directory “/Applications/xampp/htdocs”>
Options Indexes FollowSymLinks Includes execCGI
AllowOverride None
Order Allow,Deny
Allow From All
</Directory>
</VirtualHost>

With that in place you are now ready to add your other virtual hosts, in my case I’m developing a Zend application called zendapplication.  It’s located in a folder called myZendApps in the User > Documents folder.

<VirtualHost *:80>
ServerName zendapplication.dev
ServerAlias wwww.zendapplication.dev
DocumentRoot “/Users/aaronwolf/Documents/myZendApps/zendapplication/public”
<Directory “/Users/aaronwolf/Documents/myZendApps/zendapplication/public”>
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Order allow,deny
Allow from all
</Directory>
ErrorLog “logs/zendapplication-error_log”
CustomLog “logs/zendapplication-access_log” common
</VirtualHost>

For all the details and options involved with setting up a virtual host refer to the apache documentation.  The two critical configuration options here are ServerName and Document root.  ServerName denotes what domain this particular virtual hosts responds to.  DocumentRoot tells Apache where the files associated with this particular domain live.  Since Zend Framework applications (like Rails applications) only make the public directory accessible to the web I have the document root pointing to the public directory of my Zend application.

So far we,

  1. Created a localhost vertual host pointing to XAMPs default root folder (/Applications/xampp/htdocs).
  2. Created a virtual host for a zend application located in Users > aaronwolf >Documents > myZendApps > zendapplication >public.
  3. Assinded a server name (the local domain name) of our choosing to the new virtual host.

Note: I used the .dev extension for my server name.  It’s best not to use .com or .net domain names when configuring local applications, you’ll see why once you…

Configure the hosts file

The next step is to configure your host file.  A hosts file works like a DNS server associating domain names with IP address except domain names configured in your local hosts file only effect your local development machine.

In the example presented here we have configured Apache to respond to requests for zendapplication.dev now we want to be able to type zendapplication.dev in to a browser and play with our application.  Since zendapplication.dev only exists on our local development machine (not the internet) we’ll need to configure our local host file to send requests for the zendapplication.dev domain to our development computers IP address (127.0.0.1) to be handled by Apache server.  Sounds complicated but to get it done is very simple.

Fist you’ll need to open your hosts file.  On a mac you can find the hosts file in the /etc directory (you’ll need root permission to edit the file).

Open a concole window and type:

sudo nano /etc/hosts

Add the following line to the bottom of your hosts file (be sure to sperate the IP number and the domain name with a tab).

127.0.0.1        zendapplication.dev

Now when you type zendapplication.dev in to the address bar of you local browser you’ll should see…

You don’t have permission to access /xampp/index.php on this server.

Nice!  Turns out there’s one more bit of configuration to be done (at least if you’re storing you applications under the User > Documents directory on a mac like I am).  You’ll need to tell the Apache process to run with your user permissions (something that should never be done on a production machine).  Back to Application > xamp > etc, open httpd.conf and look for the following block:

<IfModule !mpm_netware_module>
#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.
#
# User/Group: The name (or #number) of the user/group to run httpd as.
# It is usually good practice to create a dedicated user and group for
# running httpd, as with most system services.
#
User nobody
Group admin
</IfModule>

Notice by default Apache is set up to run as user “nobody” which lacks permissions to access files in your Documents directory.  To fix this simply change nobody to the username you uses when logging into your machine, so in my case…

User aaronwolf
Group admin

That should about do it.  Type zendapplication.dev into your browser and go to town.

If you notice your application’s indexpage redirects to /xampp/index.php you’ll just clear your browsers chache.

Hopfully that will save someone a few hours…

Source : http://www.acwolf.com/2009/02/24/xampp-virtual-hosts-on-a-mac/

Microsoft Access 2000 and 2002 are similar. Smaller capacities for the older versions of Access are noted in the tables.

These figures are taken from Microsoft sources and published here for the convienience of my students and clients.

I no longer build full applications in Access, but it is excellent for prototypes, and under some circumstances it works well as a front end with SQL Server as a back end. In this situation the application should be an Access project.

Database specifications
Attribute Maximum
Database (.mdb) file size 2 gigabyte. However, because your database can include linked tables in other files, its total size is limited only by available storage capacity.
Number of objects in a database 32,768
Modules (including forms and reports with the HasModule property set to True) 1,000
Number of characters in an object name 64
Number of characters in a password 14
Number of characters in a user name or group name 20
Number of concurrent users 255
Table specifications
Attribute Maximum
Number of characters in a table name 64
Number of characters in a field name 64
Number of fields in a table 255
Number of open tables 2048. The actual number may be less because of tables opened internally by Microsoft Access.
Table size 2 gigabytes minus the space needed for the system objects; 1 for Access 2000 and 2002.
Number of characters in a Text field 255
Number of characters in a Memo field 65,535 when entering data through the user interface; 1 gigabyte when entering data programmatically.
Size of an OLE Object field 1 gigabyte
Number of indexes in a table 32
Number of fields in an index 10
Number of characters in a validation message 255
Number of characters in a validation rule 2048
Number of characters in a table or field description 255
Number of characters in a record (excluding Memo and OLE Object fields) 4,000; 2,000 for Access 2000 and 2002
Number of characters in a field property setting 255
Query specifications
Attribute Maximum
Number of enforced relationships 32 per table minus the number of indexes that are on the table for fields or combinations of fields that are not involved in relationships
Number of tables in a query 32
Number of fields in a recordset 255
Recordset size 1 gigabyte
Sort limit 255 characters in one or more fields
Number of levels of nested queries 50
Number of characters in a cell in the query design grid 1,024
Number of characters for a parameter in a parameter query 255
Number of ANDs in a WHERE or HAVING clause 99; 40 for Access 2000 and 2002
Number of characters in a SQL statement approximately 64,000
Form and report specifications
Attribute Maximum
Number of characters in a label 2,048
Number of characters in a text box 65,535
Form or report width 22 in. (55.87 cm)
Section height 22 in. (55.87 cm)
Height of all sections plus section headers (in Design view) 200 in. (508 cm)
Number of levels of nested forms or reports 7; 3 for Access 2000 and 2002
Number of fields or expressions you can sort or group on in a report 10
Number of headers and footers in a report 1 report header/footer; 1 page header/footer; 10 group headers/footers
Number of printed pages in a report 65,536
Number of controls and sections you can add over the lifetime of the form or report 754
Number of characters in an SQL statement that serves as the Recordsource or Rowsource property of a form, report, or control (both .mdb and .adp) 32,750
Macro specifications
Attribute Maximum
Number of actions in a macro 999
Number of characters in a condition 255
Number of characters in a comment 255
Number of characters in an action argument 255

Variable and Table Data Types

Data type Prefix Example Note
String (Text) str strCity Text to 255 characters
Date/Time dtm dtmCreated Date and Time
Boolean bln blnIsNotNull Yes/No or True/False, two values
Byte byt bytMonth One Byte, values from 0 to +255
Integer int intCount Two Bytes; values from -32,768 to +32,767; No fractions
Long
(long integer)
lng lngDistance Four Bytes, values from
-2,147,483,648 to 2,147,483,647
Single sng sngPopulation Four Bytes single precision, floating point
Currency cur curTraded Fifteen digits to the left, four to the right. Fixed decimal place.
Double dbl dblClientID Eight Bytes
Decimal dec decMicroseconds Twelve Bytes
Object obj objConnection
Variant vnt vntUserInput It can store numeric, string, date/time, Null, or Empty data
Error err errBadEmailAddress

source : http://www.databasezone.com/techdocs/acclimit.html

What about that “Private Sub MessageUser()” line from our previous example? It’s a private sub, as the name states, but try to access it from outside the Vehicle class. In the MainForm_Load() sub, try adding Van.MessageUser. You should get a build error that states ‘Vehicle.Private Sub MessageUser()’ is not accessible in this context because it is ‘Private’. Try the same thing with the _VehicleType variable and you should get a similar result.

As the error suggests, you can’t access certain types of class members from outside of the class itself.

The four types of variables we have used so far are:
Public variables. These can be access directly from the class. We choose not to use this with OP by convention. Rather we create Properties (we’ll get into this later) to adjust variables directly, or use Get/Set methods.

Private variables. These can be accessed only within the class. Private variables cannot be accessed by any subclasses or other class. These are ideal whenever you have a class you know will not be inherited. Also, these are good for storing data that should not be exposed publicly.

Protected variables. These can be accessed by the class or any subclass that is inherited. These are what I personally use because if you design a subclass later, you don’t have to change your base class code later. This is a good catchall private storage method.

Local variables. These are created by the Dim statement. These exist for the duration of the location in which they are declared. For example, if you Dim x As Int32 in Form_Load(), it will only exist in the Form_Load() method.

These four access types are also used frequently in sub/function/property headings, and thus are not limited to just variables. For more information on access types, see the MSDN article.

I know I said this was object-oriented programming. So why am I talking about classes? The answer to this question is that all objects are classes. (Mind-blowing, huh?) The way to separate the difference between objects and classes is quite easy. An object has an IS-A relationship, while a class has a HAS-A relationship.

A car IS-A vehicle, while a dog HAS-A tail. The car would be an object declared as type Vehicle, while the dog would have a member that IS-A tail. However, Fido IS-A dog. The dog class is the base template for all dog objects, so when we declare Fido as a dog, Fido is an object. Since Fido IS-A dog, Fido HAS-A tail.

IS-A = object
HAS-A = class

“Class” and “object” are sometimes used interchangeably. However, classes describe the structure of objects, while objects are instances of classes. Each instance is an exact copy of its base class. Because an object is an “instance” of a class, the act of creating an object is called instantiation.
To describe it better, a class is a blueprint, and an object is a building based on that blueprint.

To understand it, we can use an example. Open up Visual Studio, and create a new Windows Application. Go to the File menu, click Add New Item, and select “Class”. A blank class window should show up. Change the name from Class1 to Vehicle. This should be what comes up:

Code:
Public Class Vehicle 'This is an empty class End Class

We will start by creating a constructor. A constructor is a special method inside each class that tells the class what to do when it is instanced. The instantiation of a class occurs when a new instance of a class is declared. In VB.NET, this is accomplished with the New sub.

Change your class so it looks like this:

Code:
Public Class Vehicle #Region " Constructors " 'The default constructor Public Sub New() 'Tell the user that the new sub is being called. MessageBox.Show("This is a new vehicle object", "Object Oriented Programming") End Sub #End Region End Class

Notice two things. The first is the Region called “Constructors”. I usually create these different regions to keep the code window nice and neat, and as you can have multiple constructors (see below), it’s nice to keep them all in one place. The second is the code in the New sub. This should fire every time a new object is declared.

To test this out, we can add some code to the MainForm_Load() method on our form:

Code:
Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Declare a vehicle called Car and instance it Dim Car As Vehicle Car = New Vehicle() ' 'Declare a vehicle called Truck and instance it Dim Truck As Vehicle Truck = New Vehicle() End Sub

Run it. You’ll notice that you get two identical MessageBoxes that tell you that you have created a new vehicle object. That’s nice, right? Wouldn’t it be better to at least let it tell you what type of vehicle it is? We can: just overload a new constructor.

Change the class to:

Code:
Public Class Vehicle Protected _VehicleType As String #Region " Constructors " 'The default constructor Public Sub New() 'There was no parameter passed, so let's say the vehicle is a "vehicle" _VehicleType = "vehicle" ' 'Alert the user MessageUser() End Sub ' 'Another constructor that accepts a parameter Public Sub New(ByVal VehicleType As String) 'We've been passed a parameter, so let's store that in a private variable 'for later use _VehicleType = VehicleType ' 'Alert the user MessageUser() End Sub #End Region Private Sub MessageUser() 'Tell the user what type of class it is MessageBox.Show("This object is a " & _VehicleType, "Object Oriented Programming") End Sub End Class

That’s a lot! What does it mean? The first line “Protected _VehicleType As String” means that this is a variable that can be used anywhere inside the class, or any subclass (we’ll get to this topic later). The default constructor has been modified to take into account the storage variable, and if there’s no parameter passed, it sets the variable to “vehicle”.

What about that second constructor? It’s known as an overloaded constructor because it is a New sub, but has a parameter attached to it. We take the passed value and assign it to our protected variable. Let’s see what this new class does. Modify MainForm_Load to be the following:

Code:
Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Declare a vehicle called Car and instance it Dim Car As Vehicle Car = New Vehicle("car") ' 'Declare a vehicle called Truck and instance it Dim Truck As Vehicle Truck = New Vehicle("truck") ' 'Declare a vehicle called Van and instance it Dim Van As Vehicle Van = New Vehicle() End Sub

Notice how the MessageBox has been changed to reflect this addition. Car and Truck are shown to be their respective types, but because nothing was passed to the Van instantiation call, it defaults to “vehicle”.

Older Posts »

Follow

Get every new post delivered to your Inbox.