Plurk FaceBook Twitter 收進你的MyShare個人書籤 MyShare
  顯示內嵌語法

旗標技術通訊電子報
內容提供:旗標出版公司

旗標技術通訊電子報

第127期 2001.11.30

報主報報:
一年一度的資訊月開始囉!!
台北 12/1~12/9
台中 12/14~12/19
高雄 91/1/6~1/14>詳情請看資訊月網站


Dreamweaver 4 魔法書
產品編號:F460
全彩印刷
定價:490元
施威銘研究室 著
本期書摘--CSS 在網頁中的使用方式
上週大致將 CSS 的語法介紹過, 依照定義 CSS 的方式, 使
用 CSS 有三種不同類型:

1.使用外部連結樣式表

第一種方法是使用外部連結的樣式表, 也就是先把要設定的 
CSS 內容寫成一個檔案(用記事本即可), 並將其存成 CSS 檔
(副檔名.css), 網頁便可以使用連結的方式, 套用這個 CSS 
檔的樣式設定, 而不必將 CSS 語法寫在 HTML 文件中. 這樣
的好處是, 可以一次讓多個網頁共用一份樣式表, 只要變更
 .css 檔的內容, 就可以更改所有連結網頁的樣式.

2.以內嵌方式, 在網頁的開頭定義

將 CSS 語法寫在<Style>、</style>標籤之間, 並放在 
HTML 文件的開頭; 這種方式適用於指定單一網頁的樣式, 
CSS 的影響範圍為整份網頁.

3.局部套用 CSS 樣式

將 CSS 語法定義在每個 HTML 標籤旁邊, 也就是前面所說
『隨著 HTML 標籤定義』的方法; 此時所定義的樣式只會影
響該 HTML 標籤, 其他相同的 HTML 標籤並未加定義, 則不
會受到影響.

當樣式衝突時的優先順序

以上三種 CSS 使用方式, 萬一都對同一個 HTML 標籤定義
了不同樣式, 這時候網頁會聽誰的? 事實上, CSS 樣式若沒
有衝突時, 其效果是一直累加上去的; 例如在網頁開頭將
<H1>設為"紅色", 後來又將某<H1>標籤局部定義為"居
中", 則該段標題文字將會變成"紅色字+居中對齊".

如果同時對<H1>的字體顏色下了不同的定義, 此時就有一
個先後順序了, 其優先順序是:

局部套用>在開頭定義 HTML 樣式>外部連結

所以若網頁中套用了多層次的樣式表時, 別忘了檢查誰的優
先次序高, 以免預期的樣式效果無法顯現!!

-- 待續 
.........................................................................................


C# 程式設計
產品編號:F8333
定價:580元
黃昕暐 譯
本期書摘--索引器(Indexers)之四--列舉器與 foreach

如果物件可以被視為陣列, 而且也能夠使用 foreach 敘述
一一取得個別的元素, 那麼使用起來就會方便許多。要讓物
件可以搭配 foreach 使用, 就必須瞭解 foreach 背後的運
作原理。

當編譯器遇到這樣的程式區塊時:

foreach (string s in myCollection)
{
  Console.WriteLine("String is {0}", s);
}

它會將程式轉成以下形式:

IEnumerator enumerator =
  	((IEnumerable) myCollection).GetEnumerator();
while (enumerator.MoveNext())
{
  	string s = (string) enumerator.Current;
  	Console.WriteLine("String is {0}", s);
}

其中第一個步驟就是轉型為 IEnumerable, 如果轉型成功, 表
示該物件支援列舉的功能, 接著就傳回一個進行列舉工作的
IEnumerator 參址器。並透過 MoveNext () 以及 Current 循
序處理各個元素。

您可以讓做為容器的類別直接實作 IEnumerator 介面, 或者
是額外使用一個私有的類別來實作這個介面。一般來說, 我們
會比較建議使用私有類別, 因為這樣可以讓容器類別不會太過
複雜, 並且可以同時讓多個使用者循序處理該物件。

底下的範例就展示了一個支援 foreach 用法的整數集合類別 
(注意到這個類別並沒有完整實作此種類別的功能) :

using System;
using System.Collections;

// 注意:這個類別不能在多執行緒下運作
public class IntList: IEnumerable
{
	int[] values = new int[10];
	int allocated = 10;
	int count = 0;
	int revision = 0;
 
	public void Add(int value)
	{
		// 必要時重新配置
		if (count + 1 == allocated)
		{
			int[] newValues = new int[allocated * 2];
			for (int index = 0; index < count; index++)
			{
				newValues[index] = values[index];
			}
			allocated *= 2;
		}
		values[count] = value;
		count++;
		revision++;
	}
 
	public int Count
	{
		get
		{
			return(count);
		}
	}
 
	void CheckIndex(int index)
	{
		if (index >= count)
			throw new ArgumentOutOfRangeException(
				"Index value out of range");
	}
 
	public int this[int index]
	{
		get
		{
			CheckIndex(index);
			return(values[index]);
		}
		set
		{
			CheckIndex(index);
			values[index] = value;
			revision++;
		}
	}
 
	public IEnumerator GetEnumerator()
	{
		return(new IntListEnumerator(this));
	}
 
	internal int Revision
	{
		get
		{
			return(revision);
		}
	}
}

class IntListEnumerator: IEnumerator
{
	IntList  intList;
	int revision;
	int index;
 
	internal IntListEnumerator(IntList intList)
	{
		this.intList = intList;
		Reset();
	}
 
	public bool MoveNext()
	{
		index++;
		if (index >= intList.Count)
			return(false);
		else
			return(true);
	}
 
	public object Current
	{
		get
		{
			if (revision != intList.Revision)
				throw new InvalidOperationException(
	"Collection modified while enumerating.");
			return(intList[index]);
		}
	}
 
	public void Reset()
	{
		index = -1;
		revision = intList.Revision;
	}
}

class Test
{
	public static void Main()
	{
		IntList list = new IntList();
 
		list.Add(1);
		list.Add(55);
		list.Add(43);
 
		foreach (int value in list)
		{
			Console.WriteLine("Value = {0}", value);
		}
 
		foreach (int value in list)
		{
			Console.WriteLine("Value = {0}", value);
			list.Add(124);
		}
	}
}

我們只要將集合類別本身做點修改就可以了。首先, 它實作
了 IEnumerable 介面, 因此擁有一個 GetEnumerator ()函
式, 會傳回一個 IEnumerator 參址器, 可以用來引用目前的
物件串列。

IntListEnumerator 就實作了可以列舉所傳入物件的類別, 
因此實作了IEnumerator介面中的成員函式。

當程式在列舉一個集合物件時, 如果去修改集合的內容, 會
有意外的結果, 因此我們所實作的類別會偵測這樣的情況 
(也就是Main ()中第二個foreach所展示) 。在IntList類別
中, 有一個版本編號, 會在每次修改串列內容時遞增編號, 
當列舉器開始運作時, 會記下當時的版本編號, 然後在讀取
Current 屬性時檢查編號是否相同, 以判斷串列是否遭到修
改。

-- 待續 
.........................................................................................
台北資訊月 旗標破天荒 7.8折供應
前所未有的折扣 喜歡的書可要趁機一網買進!


* 全面 7.8折(特價書除外) 刷卡不加價
* 超低特賣書 99 元起,買到才是賺到!
* Windows XP 使用者升級手冊嚐新特價 199 元!
* 買任何一本書即可以 149 元換購 PCDIY 超頻散熱玩家實戰
(限購一本,特價品除外)
* 買書送 Office XP 獨家便條紙! (特價品除外)
* 二本以上再送特製 Windows XP 便條紙或哨子筆! (特價品除外)
* 買書還可參加旗標百萬贈品抽獎活動!
以上活動數量有限 送完為止
時間:90/12/1(六)--12/9(日)共 9 天 免費參觀
旗標攤位:台北世貿展一館 A907-910 B302-308

.........................................................................................
想索取前幾期的電子報內容請至智邦生活館下載
我要下載過期電子報
.........................................................................................

好書能增進知識、提高學習效率
卓越的品質是旗標的信念與堅持
歡迎光臨旗標的網站 - http://www.flag.com.tw

版權所有人:旗標出版股份有限公司
本電子報內容未經授權請勿轉載