想要自己用PHP動態做出美麗的圖? 卻又不想花大錢去買別人寫好的套件?

不用慌張, 因為這個網站會教你怎麼一步一步學GD, 趕快用你的PHP中內建的GD function來畫圖吧!

動一動腦筋可以做出意想不到的效果呢.

http://www.nyphp.org/content/presentations/GDintro/

有時候我們用中文存取MYSQL資料庫資料的時候會出現亂碼,
又也許你在PHPMYADMIN看到的時候是明碼, 但用echo抓出來後卻是" ??? " 的亂碼.
又或是在儲存的時候就已經是亂碼了, 要怎麼解決呢?

可以試試看以下的方法:

mysql_query("SET NAMEs 'utf8' ");
$sql = mysql_query("SELECT * FROM wp_posts where ID = 2");

不管INSERT 或是SELECT出來, 都在mysql_query前加入

 "SET NAMES 'utf8' " 

就可以確保資料庫存取時是以UTF-8的編碼儲存, 那在做資料轉換的過程應該就可以把編碼問題解決了~

在Silverlight宣告事件的方式有兩種:

  • 直接在XAML內部宣告 (優點:簡單明瞭, 缺點: 只能使用預設的參數, 不能再加參數)
  • 在.cs裡面作宣告 (優點: 彈性大, 可以做變化; 缺點: 比較困難(吧~) )

第一種方式:

在XAML直接作宣告(eg. 在Page.xaml):

<Canvas Loaded="Canvas_Loaded">

<Button x:Name="myButton" Content="Hello"

Canvas.Left="10″ Canvas.Top="10″ />

</Canvas>

在Page.xaml.cs作處理:

private void Canvas_Loaded(object sender, RoutedEventArgs e)

{

theButton.Content = "Please Click Me";

}

第二種方式

不需在XAML裡面宣告事件

<!– <Canvas  Loaded="Canvas_Loaded"> –>

<Canvas >

<Button x:Name="theButton" Content="I’m Indented!"

Canvas.Left="150″ Canvas.Top="20″ />

<CheckBox x:Name="RushOrder" Content="Rush"

Canvas.Left="50″ Canvas.Top="20″ FontSize="18″ />

</Canvas>

而是直接在Page.xaml.cs的Page( ) Constructor動手腳~

public Page()

{

InitializeComponent();

Loaded += new RoutedEventHandler(Page_Loaded);

}

void Page_Loaded(object sender, RoutedEventArgs e)

{

/*throw new NotImplementedException(); 去掉這行 */

theButton.Click +=new RoutedEventHandler(theButton_Click); //事件1

RushOrder.Checked += new RoutedEventHandler(RushOrder_Changed); //事件2

RushOrder.Unchecked +=new RoutedEventHandler(RushOrder_Change); //事件3

}

void RushOrder_Changed(object sender, RoutedEventArgs e)

{

if (RushOrder.IsChecked == true)

{

RushOrder.Content = "RUSH";

}

else

{

RushOrder.Content = "Rush";

}

}

在SilverLight中用來規劃整個版面Layout的Control主要有三種:

  • Grid: 就像Table一樣, 將物件以行列的方式對齊
  • StackPanel: 讓物件之間相對對齊, 如相鄰對齊或向上對齊
  • Canvas: 用絕對對齊(absolute positioning) 的方式放置物件(與SilverLight 1.0相符)

Grid

Grid 在使用VS2008開啟新檔案的時候就已經存在XAML裡面了, 格式會長這個樣子:

<UserControl x:Class="EasyGrid.Page"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Width="400″ Height="300″>

<Grid x:Name="LayoutRoot" Background="White">

</Grid>

你可以先規劃整個SilverLight App的框線, 以便之後的對齊作業, 定義的方式如下:

<Grid x:Name="LayoutRoot" Background="White">

<Grid.RowDefinitions>

<RowDefinition Height="50″ />

<RowDefinition Height="30*" MaxHeight="70″ />

<RowDefinition Height="40*" MaxHeight="70″ />

<RowDefinition Height="*" MinHeight="30″ MaxHeight="50″ />

<RowDefinition Height="Auto" MinHeight="5″ MaxHeight="30″ />

</Grid.RowDefinitions>

</Grid>

Height: 每一列的高度

MaxHeight: 能夠拉伸的最大高度 (* 表示以比例的方式定義高度, 兩倍高就是 2*)

MinHeight: 能夠拉伸的最小高度

StackPanel

Stack就是堆疊的意思, 使用StackPanel你可以將你的物件以左右堆疊或者上下堆疊的方式排列, 就像書本在書架上一樣. 它也是在SilverLight2.0經常使用的對齊工具. 下面以放置TextBlock, TextBox, CheckBox及Button 為例:

<StackPanel Background="Beige" Orientation="Vertical" >

<TextBlock Text="Your name?"

HorizontalAlignment="Left" Margin="10,2,0,1″/>

<TextBox Width="150″ Height="30″

HorizontalAlignment="Left" Margin="10,2,0,1″/>

<Button Content="Submit this information"

HorizontalAlignment="Left"

Margin="10,2,0,1″ Height="30″ Width="150″ />

<CheckBox Content="With Zing!" HorizontalAlignment="Left"

Margin="10,2,0,1″ />

</StackPanel>

屬性:

Background: Stack背景的顏色

Orientation: 排列方向, Vertical是垂直
在StackPanel內部的物件Margin="10,2,0,1″ 的Margin順序是左, 上, 右, 下.

SilverLight的Control有很多, 以後會逐一介紹其用法, 首先介紹TextBlock的屬性:

<TextBlock x:Name="TestName" Grid.Row="0″ Grid.Column="0″ Text="Testing Name: "  Margin="5″ />

應用: TextBlock的使用方法跟.NET的Label Control很像, 就是專門顯示文字用的.

屬性:

Grid.Row, Grid.Column叫做Extended Properties, 功能是對齊週邊的Grid格線, 讓App看起來較整齊.
Text 功能就是顯示內部的文字.

Margin很有趣, 輸入不同數目的值就有不同的Margin效果.
Margin="5″ : 表示 左, 右, 上, 下 都是空出5px.
Margin="5,6″ : 表示 左右空出5px, 上下空出6px.
Margin="5,6,7,8″: 表示 左5px, 上6px, 右7px, 下8px.

如果您的安裝順序是:

1. Visual Studio 2008
2. SilverLight 2 BETA 2 Tools for Visual Studio 2008

應該可以安裝成功,

但如果安裝的順序是:

1. Visual Studio 2008
2. SilverLight 1.0 Runtime
3. SilverLight 2.0 Runtime
4. SilverLight 2 BETA 2 Tools for Visual Studio 2008

則會在安裝的時候出現ERROR. 經過測試, 要解決這個問題方法如下:

1. 控制台 > 新增與移除程式 > 將SilverLight 1.0, 2.0 的RUNTIME都徹底移除
2. 將Program Files 的 SilverLight, SilverLight SDK都移除乾淨.
3. 再安裝SilverLight 2 BETA 2 Tools for Visual Studio 2008 就可以成功了.

建議的安裝順序為:

1. Visual Studio 2008
2. Silverlight 2.0 Run time.
3. Expression Blend 2.5
4. Visual Studio 2008 SP1
5. silverlight_chainer.exe

當我們在撰寫物件導向程式的時候, 難免會需要將參數傳入Method裡面, 若傳入的參數是陣列, 格式如下:

static void Main(string[] args)
{

int[] a = new int[2]{5,7};

Util util = new Util();

Console.WriteLine(util.Min(a));

}

class Util
{

public int Min(int[] param)
{
if (param == null || param.Length == 0)
{
throw new ArgumentException("Util.Min: not enough arguments");
}

int currentmin = param[0];

foreach (int i in param)
{
if (i < currentmin)
{
currentmin = i;
}
}

return currentmin;
}

}

這種寫法應該很直觀吧, 但如果傳入的參數是Integer豈不是出現Error? 要怎麼解決呢? 其實要解決這個問題非常簡單, 就是在Method的參數部分加入 "params"這個關鍵字, 寫法如下:

class Util
{

public int Min(params int[] param)
{
if (param == null || param.Length == 0)
{
throw new ArgumentException("Util.Min: not enough arguments");
}

int currentmin = param[0];

foreach (int i in param)
{
if (i < currentmin)
{
currentmin = i;
}
}

return currentmin;
}

}

這樣一來傳入的參數會經過compiler做以下的動作:

int min = Util.Min(first, second);
int[] array = new int[2];
array[0] = first;
array[1] = second;
int min = Util.Min(array);

你的主程式就可以彈性傳入參數, 夠方便吧?

static void Main(string[] args)
{

int[] a = new int[2]{5,7};

Util util = new Util();

Console.WriteLine(util.Min(a));//可以傳入陣列型態的變數

int b = util.Min(2, 10); //同時可以傳入多個Integer

Console.WriteLine(b);

}

使用params有幾個注意事項:

  • 陣列不能是multidimensional
  • 使用params的method不能Overloading (多載)
  • 使用params的method不能是ref 或這 out
  • method傳入的參數只能有一個params array
  • 我們先把話說在前頭, Javascript的所有函數並不適用在所有的瀏覽器, 這個大家都贊同吧?

    所以你一定會跟我一樣想先擷取使用者的瀏覽器版本, 看看它是用IE, MOZILLA還是Opera等等的, 但這樣的方法真的好用嗎? 老實說這是相當難維護的, 因為瀏覽器會一直更新, 如果你都用IF ELSE來判斷它的版本應該會要一直更新吧, 而且你又要怎麼判斷你的使用者會不會比你更快更新它的瀏覽器呢?

    舊的方法如下:

    javascript:alert(navigator.userAgent);

    如果你使用IE7, 它會回傳給你: Mozilla 4.0/ …..

    這樣的方法真的不是很好, 在這裡有個不錯的方式來判斷:

    if (typeof featureName != "undefined") {
    // 程式碼
    }

    舉例如下:

    if (typeof document.getElementById != "undefined") {
    alert("getelembyid is supported");

    } else {
    alert("no getelembyid support");
    }

    我們要判斷瀏覽器是否支援getElementById 就可以直接用typeof document.xx != "undefined" 來判斷 如果使用者不支援這個函數你就可以再另外想辦法. 另外一種寫法如下:

    var getElem = (typeof document.getElementById == "function") ? true : false;
    if (getElem) {
    // 我們知道GetElementbyId是支援的,
    // 所以我們就可以用它.
    }

    這樣是不是比較實際且容易維護呢?