2012年7月25日 星期三

放下、放空、放平、放心、放手

雖然是老生常談,但是每次看還是有感覺...

新來的小沙彌,對什麼都好奇。秋天,禪院裡紅葉飛舞,小沙彌跑去問師父:「紅葉這麼美,為什麼會掉呢?」
師父一笑:「因為冬天來了,樹撐不住那麼多葉子,只好捨。這不是『放棄』,是『放下』!」
冬天來了,小沙彌看見師兄們把院子裡的水缸扣過來,又跑去問師父:「好好的水,為什麼要倒掉呢?」
師父笑笑:「因為冬天冷,水結凍膨脹,會把缸撐破,所以要倒乾淨。這不是『真空』,是『放空』!」
大雪紛飛,厚厚的,一層又一層,積在幾棵盆栽的龍柏上,師父吩咐徒弟合力把盆搬倒,讓樹躺下來。小和尚又不解了,急著問:「龍柏好好的,為什麼弄倒?」
師父臉一整:「誰說好好的?你沒見雪把柏葉都壓塌了嗎?再壓就斷了。那不是『放倒』,是『放平』,為了保護它,教它躺平休息休息,等雪霽再扶起來。」
天寒,加上全球金融危機,香油收入少多了,連小沙彌都緊張,跑去問師父怎麼辦。「少你吃?少你穿了嗎?」師父瞪一眼:「數數!櫃裡還掛了多少衣服?柴房裡還堆了多少柴?倉房裡還積了多少土豆?別想沒有的,想想還有的;苦日子總會過去,春天總會來。你要放心。『放心』不是『不用心』,是把心安頓。」
春天果然跟著來了,大概因為冬天的雪水特別多,春花爛漫,更勝往年,前殿的香火也漸漸恢復往日的盛況。師父要出遠門了,小沙彌追到山門:「師父您走了,我們怎麼辦?」
師父笑著揮揮手:「你們能放下、放空、放平、放心,我還有什麼不能放手的呢?」

-----------------------------------------------------------------------------

從小我們努力學習許多的知識,隨著年齡的增加,學校教會了我們許多,我們的知識也變的豐富淵博,但學校從來沒有人教過我們「放下、放空、放平、放心、放手」。
放下、放空、放平、放心、放手並沒有辦法像許多的知識一般,光是用文字講解就能讓人學會,它是人生的功課,也是一種智慧的結晶,必需從我們所經歷的各種事去慢慢體會才能學到,而學習過程中可能會經歷許多刻骨銘心的事件。
當我們碰到困難時,換個心境,我們正在學習人生中的功課,當我們能自在面對每一種困境時,這代表我們已學會了這一堂課。

2012年7月24日 星期二

剪貼簿(Clipboard)和動態數據交換

轉貼自剪貼簿和動態數據交換

應用程式間的數據交換是象Windows 這樣的多工環境的重要特性。作為一種基於Windows的開發工具,Delphi支援如下四種數據交換方式:剪貼簿、動態數據交換 ( DDE)、物件聯接與嵌入(OLE)以及動態聯接庫(DLLs)。這中間前三種方式最為常用,OLE功能最為強大,DDE次之。而剪貼簿使用最為方便。在本章,我們只討論剪貼簿和動態數據交換。利用OLE實現數據交換見下一章,利用動態聯接庫(DLLs)進行數據交換將在第十章中介紹。  

7.1 剪貼簿及其應用 

本質上,剪貼簿只是一個全局記憶體塊。當一個應用程式將數據轉送給剪貼簿後,通過修改記憶體塊分配標誌,把相關記憶體塊的所有權從應用程式移交給Windows自身。其它應用程式可以通過一個句柄找到這個記憶體塊,從而能夠從記憶體塊中讀取數據。這樣就實現了數據在不同應用程式間的傳輸。  

剪貼簿雖然功能較為簡單,且不能實現即時傳輸,但卻是更為複雜的DDE和OLE的基礎。對於一些只是偶爾需要使用其它應用程式數據的程式來說,使用剪貼簿不失為一種方便、快捷的方式。

Delphi把剪貼簿的大部分功能封裝到一個TClipboard類中,同時把使用頻度最高的文本傳輸功能(包括DBImage的圖像傳輸功能)置入相應部件作為部件的方法,從而使用戶可以十分方便地使用剪貼簿進行程式設計。 

7.1.1 使用剪貼簿傳輸文本 

剪貼簿傳輸文本主要是應用如下的三個方法:CopyToClipboard、CutToClipboard 和PasteFromClipboard。包含這些方法的部件如下表所示。 

   表7.1 包含剪貼簿方法的部件

───────────────────────────

方 法 部 件

??????????????????????????????????????????????????????

TDBEdit TDBMemo

TDBImage

CopyToClipboard TEdit TMemo TMaskEdit

TOLEContainer

TDDEServerItem

??????????????????????????????????????????????????????

TDBEdit TDBMemo

CutToClipboard TDBImage

TEdit TMemo TMaskEdit

??????????????????????????????????????????????????????

TDBEdit TDBMemo

PasteFromClipboard TDBImage

TEdit TMemo TMaskEdit

─────────────────────────── 

除TDBImage外,其餘全是有關文本的控件。

在把文本傳輸到剪貼簿之前,文本必須被選中。

若選TMaskEdit的AutoSelect屬性為True,則當MaskEdit獲得輸入焦點時文本自動被選中;若選TEdit、TMemo的HideSelection屬性為True,則失去焦點時,文本選中狀態自動隱藏,重新獲得焦點時再顯示。

下面的語句把MaskEdit中選中的文本剪下來到剪貼簿: 

MaskEdit .CutToClipboard; 

下面的語句把剪貼簿中的文本貼上去到Memo的目前遊標處: 

Memo.PasteFromClipboard; 

利用剪貼簿類也可以實現文本的傳輸,見(7.1.2)中的介紹。 

7.1.2 剪貼簿類 

為方便剪貼簿的操作,Delphi在Clipbrd庫單元中定義了一個TClipboard類,並且預定義了一個變數Clipboard作為類TClipboard的實例,從而使用戶在絕大多數場合不必自己去定義一個TClipboard的實例。

利用剪貼簿類可以進行文本、圖像和部件的傳輸,剪貼簿類為實現這些方法提供了相應的屬性和方法。表7.2、表7.3列出了TClipboard屬性和方法的意義。  

表 7.2 TClipboard的屬性

───────────────────────────

屬 性 意 義

———————————————————————————

AsText 存檔剪貼簿的文本,只有執行時才可設定

FormatCount 可用剪貼簿格式的數目

Formats 可用剪貼簿格式鍊

─────────────────────────── 

   表 7.3 TClipboard的方法

─────────────────────────────────────

方 法 參 數 意 義

—————————————————————————————————————

Clear 無 清除剪貼簿的內容

Assign Source:TPersistent 把Source參數指定的物件拷貝到剪貼簿,常

用於圖形、圖像物件

Open 無打開剪貼簿,阻止其它應用程式改變它的內容

Close 無 關閉打開的剪貼簿

SetComponent Source:TPersistent 把部件拷貝到剪貼簿

GetComponent Owner 從剪貼簿取回一個部件並放置

Parent :TPersistent

SetAsHandle Format:Word 把指定格式數據的句柄交給剪貼簿

返回型式:THandle

GetAsHandle Format:Word 返回剪貼簿指定格式數據的句柄

返回型式:THandle

HasFormat Format:Word 判斷剪貼簿是否擁有給定的格式

返回型式:Boolean

SetTextBuf Buffer:PChar 設定剪貼簿的文本內容

───────────────────────────────────── 

  剪貼簿中可能的數據格式如下表。 

表 7.4 剪貼簿數據格式及其意義

──────────────────────────────

數據格式 意 義

——————————————————————————————

CF_TEXT 文本。每行以CF_LF結束,nil標誌文本結束

CF_BITMAP Windows點陣圖

CF_METAFILE Windows元文件

CF_PICTURE TPicture型式的物件

CF_OBJECT 任何TPersistent型式的物件

─────────────────────────────── 

利用TClipboard實現文本的傳輸使用AsText屬性和SetTextBuf方法。

AsText屬性為非控件部件的剪貼簿操作提供了方便。如: 

Clipboard. AsText := Form1.Caption ; 

把Form1的標題拷貝到剪貼簿。 

Label1.Caption := Clipboard.AsText; 

把剪貼簿中的文本寫入Label1。

SetTextBuf用於把超過255個字元的字元串拷入剪貼簿。 

7.1.3 利用剪貼簿傳輸圖像 

7.1.3.1 拷貝 

Image部件上的內容和窗體上的圖形可以直接拷貝到剪貼簿。圖像拷貝利用Clipboard的Assign方法。

例如: 

Clipboard.Assign(Image1.Picture); 

把Image1上的圖像拷貝到剪貼簿。 

7.1.3.2 剪下來 

圖像的剪下來是首先把圖像拷貝到剪貼簿,而後在原位置用空白圖像進行覆蓋。

下面一段程式表示了圖像的剪下來。  

procedure TForm1.Cut1Click(Sender: TObject);

var

ARect: TRect;

begin

Clipboard.Assign(Image1.Picture);

with Image.Canvas do

begin

CopyMode := cmWhiteness;

ARect := Rect(0, 0, Image.Width, Image.Height);

CopyRect(ARect, Image.Canvas, ARect);

CopyMode := cmSrcCopy;

end;

end;

7.1.3.3 貼上去 

從剪貼簿上貼上去圖像,首先偵測剪貼簿上的數據格式。如果格式為CF_BITMAP,則呼叫目標點陣圖的Assign 方法貼上去圖像。

程式清單如下。

procedure TForm1.PasteButtonClick(Sender: TObject);

var

Bitmap: TBitmap;

begin

if Clipboard.HasFormat(CF_BITMAP) then

begin

Bitmap := TBitmap.Create;

try

Bitmap.Assign(Clipboard);

Image.Canvas.Draw(0, 0, Bitmap);

finally

Bitmap.Free;

end;

end;

end; 

try...finally為資源保護塊,參第十二章。

7.1.4 建立自己的剪貼簿觀察程式 

在這一節中我們要建立一個自己的剪貼簿觀察程式,用來存檔截獲到剪貼簿中的點陣圖。

Windows允許用戶建立自己的剪貼簿觀察程式,並把該程式加入到一個剪貼簿觀察器鍊中。在鍊中,位置靠前的程式有義務把有關剪貼簿的訊息傳遞到緊隨其後的觀察程式。而處於鍊首的程式由Windows的訊息回圈機制直接把剪貼簿訊息發送過來。

建立一個剪貼簿觀察程式,首先該程式必須能響應相應的Windows訊息。對於那些熟悉Microsoft公司Visual Basic的讀者來說,這是令他們頭疼而束手無策的地方。但Delphi在這方面卻有良好的表現:利用關鍵字message,用戶可以將一個過程定義為響應特定的Windows訊息。如: 

procedure WMDrawClipboard(var Msg:TWMDrawClipboard);

message WM_DRAWCLIPBOARD; 

可以響應WM_DRAWCLIPBOARD訊息。類TWMDrawClipboard是訊息類Message 的子類。Delphi把所有的訊息都重新進行了定義,使用戶在使用時可以直接引用其便於記憶的數據成員,而不必再自己動手去分解訊息。雖然這並不能算作是一個重大的改進,但卻體現了Delphi處處為用戶方便著想的特點。

我們將要建立的程式目的是把截獲到剪貼簿上的點陣圖存檔下來。在本書的寫作過程中,這一工作是大量存在的。雖然利用Windows工具PaintBrush(畫筆),通過貼上去、存檔等操作可以實現這一功能,但卻存在以下一些問題:

1.程式頻繁切換影響效率,當有大量點陣圖存在時更是如此;

2.畫筆有一個很討厭的缺陷:當剪貼簿上的點陣圖比畫筆介面的用戶區大時,用戶區外的點陣圖被截斷。因而往往需要根據所截獲點陣圖的大小來調整畫筆用戶區的大小,並重新進行貼上去。而如果開始就把畫筆用戶區調整到足夠大,又會覆蓋掉螢幕上一些有用的資訊。

為解決這些問題,我開發了下面的程式。程式啟動時,以極小化方式執行。此時只要剪貼簿中存入點陣圖,則自動彈出一個對話方塊請求用戶存檔。如果用戶希望查看確認,則可以連續按兩下執行程式圖示,選擇相應按鈕,剪貼簿中的點陣圖就會顯示在螢幕上。

部件關鍵屬性設計如下: 

ClipSaveForm:

Caption=‘Save Bitmap in Clipboard '

Panel1:

Align = ' Top '

Image1:

Align = ' Client '

SaveDialog1:

FileEditStyle = fsEdit

FileName = '*.bmp'

Filter = 'Bitmap Files(*.bmp)|*.bmp|Any Files(*.*)|*.*'

InitialDir = 'c:\bmp'

Title = 'Save Bitmap' 

程式主視窗是TForm派生類TClipSaveForm的實例。TClipSaveForm通過定義一些私有數據成員和過程,使響應和處理Windows的相應訊息成為可能。下面是TClipSaveForm的類定義: 

type

TClipSaveForm = class(TForm)

SaveDialog1: TSaveDialog;

Image1: TImage;

Panel1: TPanel;

Button1: TButton;

SpeedButton1: TSpeedButton;

SpeedButton2: TSpeedButton;

Button2: TButton;

procedure FormCreate(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure SpeedButton1Click(Sender: TObject);

procedure SpeedButton2Click(Sender: TObject);

private

{ Private declarations }

MyBitmap: TBitmap; { 存檔截獲的點陣圖 }

View: Boolean; { 判斷是否顯示 }

NextViewerHandle: HWND; { 下一剪貼簿觀察器的句柄 }

procedure WMDrawClipboard(var Msg:TWMDrawClipboard);

message WM_DRAWCLIPBOARD;

procedure WMChangeCBChain(var Msg:TWMChangeCBChain);

message WM_CHANGECBCHAIN;

{ 響應Windows的剪貼簿訊息 }

public

{ Public declarations }

end;

視窗建立時,把該視窗登入為剪貼簿觀察器,加入到剪貼簿觀察器鍊中,同時進行變數、部件和剪貼簿的初始化。 

procedure TClipSaveForm.FormCreate(Sender: TObject);

begin

View := False;

SpeedButton2.Down := True;

MyBitmap := TBitmap.create;

try

MyBitmap.Width := 0;

MyBitmap.Height := 0 ;

except

Application.terminate;

end;

Clipboard.Clear;

NextViewerHandle := SetClipboardViewer(Handle);

end; 

視窗關閉時,結束剪貼簿觀察器鍊,並釋放記憶體: 

procedure TClipSaveForm.FormDestroy(Sender: TObject);

begin

ChangeClipboardChain(Handle,NextViewerHandle);

MyBitmap.Free;

end; 

在以上兩段程式中用到的兩個Windows API函數SetClipboardViewer和ChangeClipboardChain分別用於登入和結束剪貼簿觀察器鍊。

程式存檔點陣圖的功能是在訊息響應過程WMDrawClipboard中實現的。該過程在剪貼簿內容有變化時被呼叫。 

procedure TClipSaveForm.WMDrawClipboard(var Msg: TWMDrawClipboard);

var

FileName: String;

begin

If NextViewerHandle <> 0 then

SendMessage(NextViewerHandle,msg.Msg,0,0);

If ClipBoard.HasFormat(CF_BITMAP) then

begin

MyBitmap.Assign(Clipboard);

If SaveDialog1.Execute then

begin

FileName := SaveDialog1.FileName;

MyBitmap.SaveToFile(FileName);

end;

If View then

begin

WindowState := wsNormal;

Image1.Picture.Bitmap := MyBitmap;

end;

end;

Msg.Result := 0;

end; 

程式首先判斷在剪貼簿觀察器鍊中是否還存在下一個觀察器。如果有,則把訊息傳遞下去,這是剪貼簿觀察器程式的義務。而後判斷剪貼簿上內容的格式是否為點陣圖。如是,則首先把剪貼簿上內容存檔到數據成員MyBitmap中,並激活一個文件存檔對話方塊把點陣圖存檔到文件中。如果View=True,則把視窗狀態(WindowState)設定為wsNormal,並把MyBitmap賦給Image部件的相應值,使用戶可以對剪貼簿上的點陣圖進行觀察。

訊息響應過程WMChangeCBChain在剪貼簿觀察器鍊上其它觀察器結束時被呼叫。根據被移出觀察器的不同位置決定了不同的處理方法。

procedure TClipSaveForm.WMChangeCBChain(var Msg: TWMChangeCBChain);

begin

if Msg.Remove = NextViewerHandle then

NextViewerHandle := Msg.Next

else

if NextViewerHandle <> 0 then

SendMessage(NextViewerHandle,Msg.Msg,Msg.Remove,Msg.Next);

Msg.Result := 0;

end;

視窗上有兩個加速按鈕,兩個按鈕。它們擊鍵(click)事件處理過程如下。每一程式段的意義是非常顯然的。 

procedure TClipSaveForm.Button1Click(Sender: TObject);

begin

Close;

end;

procedure TClipSaveForm.Button2Click(Sender: TObject);

begin

WindowState := wsMinimized;

end;

procedure TClipSaveForm.SpeedButton1Click(Sender: TObject);

begin

View := True;

Image1.Picture.Bitmap := MyBitmap;

end; 

procedure TClipSaveForm.SpeedButton2Click(Sender: TObject);

begin

View := False;

Image1.Picture.Bitmap := nil;

end; 

通過對這個程式的介紹,以下幾點是應該注意的:

1.提供了一種自己截獲和處理剪貼簿上內容的方法。讀者可以根據需要進一步擴充;

2.提供了響應Windows訊息的方法。在第三篇有關自定義部件開發的內容中,這一問題還要詳細論述;

3.最後的一點啟示是:在Delphi程式開發中巧妙應用傳統的Windows方法(如訊息處理、 API函數等)仍是很有必要的。而在應用這些方法中所體現的方便之處,正是Delphi勝過其它可視化開發工具的一個重要方面。 

7.2 Windows的DDE原理和 Dephi的DDE實現機制 

7.2.1 Windows的DDE原理 

Windows的DDE機制基於Windows的訊息機制。兩個Windows應用程式通過相互之間傳遞DDE訊息進行DDE交談(Conversation),從而完成數據的請求、接聽、傳輸。這兩個應用程式分別稱為伺服器(Server)和用戶(Client)。伺服器是數據的提供者,用戶是數據的請求和接受者。

DDE交談由用戶程式啟動。用戶程式把一條訊息(WM_DDE_INITIATE)傳播給目前執行的所有Windows程式。這條訊息指明了用戶程式所需要的一般數據(應用程式、主題)。擁有這些數據的DDE伺服器可以響應這條被傳播的訊息。此時,DDE交談就開始了。

由於在每個主題中,DDE伺服器可以支援一個或多個數據項,所以在用戶請求數據時應同時指明應用程式名、主題名和項目名。應用程式、主題、項目是DDE中三個最基本的概念。

利用Windows本身提供的DDE訊息和API進行DDE程式設計是一件相當棘手的問題。 雖然使用DDE管理庫(ddeml.dll)可以一定程度上減輕開發者的工作負擔,但開發DDE程式仍不是一件輕鬆的事情。

此時Delphi出現了!Delphi通過其自身巧妙的設計使開發一個DDE應用程式同開發一個普通程式一樣地快捷、方便。 

7.2.2 Delphi的DDE實現機制簡介 

Delphi把所有的DDE功能做到四個部件中,它們是:

● TDDEClientConv : 用於用戶程式建立和維護一個DDE交談

● TDDEClientItem : 用於用戶程式建立和維護數據交換通道

● TDDEServerConv : 用於伺服器程式響應DDE交談

● TDDEServerItem : 用於伺服器程式維護數據交換通道 

  前兩個部件用於產生一個DDE用戶程式,後兩個部件用於產生一個DDE伺服器程式。如果一個應用程式同時擁有這些部件,則這一程式既可以充當DDE用戶,也可以充當DDE伺服器。

交談部件TDDEClientConv、TDDEServerConv用於建立和維護一個DDE交談。DDE交談包括DDE服務和DDE主題兩部分。

DDE服務是DDE伺服器的標簽,即在一般的Windows DDE機制中所講的應用程式名。一般說來這一標簽是DDE伺服器應用程式執行檔案標簽去掉 .EXE後綴。比如你的應用程式要和Word 6.0建立交談,則DDE服務為WINWORD。但也不盡然。比如你的應用程式要和Borland ReportSmith ( RPTSMITH.EXE ) 建立交談,則DDE 服務為 Report Smith。DDE服務到底如何,讀者可參看相關的DDE伺服器應用程式文檔。

DDE主題是一個包含了聯接資訊的數據單元。一般說來DDE 主題是一個包括檔案附加名的完整檔案標簽。例如和Excel中的一個文件建立DDE交談,則主題可能是 

Topic = 'c:\excel\Example\sale.xls' 

如果伺服器是一個Delphi應用程式,缺省情況下主題是包含欲聯接數據窗體的標題。如果伺服器使用了DDEServerConv部件,則要求使用部件DDEServerConv的標簽作為DDE主題。

項目部件TDDEclientItem、TDDEServerItem用於建立和維護DDE數據的傳輸通道。 DDE項目中包含著實際欲傳輸的數據。DDE項目的格式取決於DDE伺服器應用程式。一個可能的DDE項目例子是電子表格中的單元和資料庫表中的欄位。如果伺服器是Delphi應用程式,則項目是連接的 DDEServerItem部件的標簽。

Delphi的DDE實現機制方便、實用,但也有一個令人遺憾的缺陷:只能傳輸文本數據以及命令、宏,而不能傳輸圖像數據。在這一點上微軟公司推出的Visual Basic 要略勝一籌。不過在目前文本數據的使用仍是最廣泛的,而且圖像傳輸可以利用剪貼簿和OLE來實現,則這一缺陷也並無很大的影響 

7.3 DDE用戶程式的實現

DDE用戶程式啟動DDE交談,向伺服器請求並從伺服器接收數據。同時還可以向伺服器發送數據、命令、宏,改變伺服器的狀態並控制伺服器的執行。 

7.3.1 聯接模式(ConnectMode)

Delphi的DDE提供了兩種聯接模式:自動和人工。這可以通過DDEClinetConv 部件的ConnectMode屬性進行設定。如下表所示。 

表 7.5 DDE的聯接模式

───────────────────────────────

     值           意      義

———————————————————————————————

ddeAutomatic 在執行中當包含TDDEClientConv部件的視窗建立時

聯接自動建立

ddeManual 只有當呼叫OpenLink方法時聯接才建立

───────────────────────────────   

不同聯接模式,DDE用戶程式的實現方式不同。

對於自動模式:

1. 向窗體中加入DDEClientConv和DDEClientItem部件並命名;

2. 把DDEClientItem部件的DdeConv屬性設定為DDEClientConv部件的標簽;

如果在設計時建立,則通過物件觀察器進行選擇;如果在執行時建立聯繫, 則通過如下的一條語句設定屬性的值: 

DDEClientItem1.DdeConv := 'DDEClientConv1' ; 

3. 和伺服器建立聯繫,實現數據共享。

對於人工模式:

1.向窗體中加入DDEClientConv部件;

2.和伺服器建立聯繫;

3. 數據更新時呼叫RequestData方法申請並獲得數據。 

7.3.2 和DDE伺服器建立聯繫 

和DDE伺服器建立聯繫,既可以在設計時進行,也可以在執行時進行。

在設計時,DDE聯接可以通過剪貼簿進行貼上去。具體步驟如下:

1. 激活伺服器程式,並選中你的用戶程式欲聯接的數據;

2. 把數據和DDE聯接資訊拷貝到剪貼簿上。一般說來這只需要選擇伺服器應用程式的 Edit|Copy 選擇表;

3. 在Delphi IDE的設計窗體中選中DDEClientConv部件;

4. 在Object Inspector(物件觀察器)中按一下DDEService屬性或DDETopic屬性,然後再按一下Ellipsis按鈕,打開DDE Info對話方塊;

5.選擇Paste Link按鈕。此時App編輯框和Topic編輯框被自動填充。如果Paste Link按鈕變灰,敘述你準備用作伺服器的應用程式不支援DDE或者DDE資訊沒有被成功地拷貝到剪貼簿上;

6.選擇OK 按鈕。此時Object Inspector中的DDEService、DDETopic 屬性包含了建立一個DDE聯接的正確值。

對於人工模式以下步驟是不需要的。

7.選中DDEClientItem部件,並在Object Inspector中設定DdeConv屬性為已完成聯接的DDEClientConv部件標簽;

8.假如剪貼簿上的DDE 聯接資訊仍保留的話,從Object Inspector的下拉列示方塊中選擇 DDEItem 屬性的值。否則輸入正確的值。

在執行時,呼叫 SetLink 方法來建立DDE聯接。

SetLink有兩個String型式的參數,分別用來接受DDEService和DDETopic的值。過程執行後DDEClientConv部件的DDEService 和DDeTopic屬性被設定。要注意的是:在執行時直接設定DDEService和DDETopic的值並不能建立一個DDE聯接,而必須呼叫SetLink 方法進行初始化。

比如,下面的語句和Excel的System主題建立聯接: 

DDEClietnConv. SetLink('Excel','System'); 

呼叫SetLink方法後,還需要設定DDEClientItem部件的DDEItem屬性。

比如,下面的語句聯接Excel的Topics項目,用以獲取目前活躍文件的檔案標簽: 

DDEClietnItem.DDEItem := 'Topics'; 

當DDE聯接建立後,聯接的數據存檔在DDEClientItem部件的Text和Lines 屬性中,Text用於存檔一個字元串(String),Lines用於存檔一個字元串鍊表(TStrings)物件。

為了顯示聯接數據,可以在DDEClientItem的OnChange事件中把數值賦給一個可視部件。

下面的事件過程把聯接數據即時地顯示在一個編輯框中。

procedure Form1.DDEClientItemChange(Sender: Tobject);

begin

Edit1.Text := DDEClientItem1.Text;

end; 

執行狀態下也可以從剪貼簿上貼上去DDE聯接資訊,並呼叫SetLink建立DDE交談。下面的例子顯示了當用戶按下應用程式中的Paste Link按鈕時,動態建立DDE交談的過程。 

procedure Form1.OnPasteLink(Sender: Tobject);

var

Service, Topic, Item: String;

begin

if GetPasteLinkInfo (Service, Topic, Item) then

begin

AppName.Text := Service;

TopicName.Text := Topic;

ItemName.Text := Item;

DDEClient.SetLink (Service, Topic);

DDEClientItem.DdeConv := DDEClient;

DDEClientItem.DDEItem := ItemName.Text;

end;

end; 

GetPasteLinkInfo是DDEMan 庫單元中定義的一個過程。如果返回True,則DDE聯接資訊存檔在三個參數中;如果返回False,敘述剪貼簿上沒有正確格式的DDE聯接資訊。 

7.3.3 數據申請 

雖然自動模式快捷、方便,但仍有一些理由使用DDE的人工模式:

1.伺服器程式可能不支援自動數據傳輸,用戶必須顯式申請伺服器更新一個特定的項目;

2.節省通信費用。假如沒有即時傳輸的要求,則人工模式可以大幅度降低通信的開銷;

3.若用戶程式只用於控制伺服器的執行,則往往沒有必要使用自動模式。

人工模式下用戶程式的數據更新需要採用數據申請的方式。數據申請需要呼叫DDEClientConv部件的RequestData方法。RequestData有一個參數,指向要申請的DDE項目。RequestData返回一個Pchar型式的無結束符字元串,包含了申請到的文本。返回字元串佔用的記憶體必須在程式終止前顯式釋放。

在人工模式下,即使存在一個DDEClientItem部件且與DDEClientConv相聯接,數據更新後DDEClientItem部件的Text、Lines屬性的值也不會改變。 

7.3.4 數據發送 

數據發送與一般的DDE數據流向正好相反,是把數據從DDE用戶應用程式發送到DDE伺服器應用程式。

數據發送使用DDEClientConv部件的兩個方法PokeData 和 PokeDataLines, 它們的語法是: 

function PokeData (Item: String ; Data: PChar): Boolean;

function PokeDataLines (Item: String ; Data: TStrings): Boolean; 

參數Item是DDE伺服器中被聯接的項目,Data是要發送的數據。如果數據是一個字元串,則把它轉化為PChar型式並呼叫PokeData方法;如果數據是一個字元串鍊表物件,可呼叫PokeDataLines方法。

方法的返回值標誌數據轉送是否成功。因為有一些DDE伺服器應用程式並不接收發送的數據。

下面的語句把編輯框中的內容發送給伺服器: 

StrPCopy(TheText , Edit1.text);

DDEClientConv1.PokeData(DDEClientItem1.DDEItem , TheText); 

過程StrPCopy把一個Pascal型式的字元串拷貝到一個無結束符的PChar型式字元串中。

2012年7月22日 星期日

邊際效用

只要是要學經濟學的,免不了要碰到邊際這兩個字
譬如說邊際效用
他指的是「多增加一點消費,所多增加的效用」
邊際成本就是「多增加一點產出,所多增加的成本」
舉個例子,
一個很餓的人,第一碗飯對他的價值很高,給他的快樂可能是100單位,
第二碗飯他已經不那麼餓了,所以價值是50單位,
第三碗飯他已經差不多飽了,價值剩10單位。
到了第四碗飯,價值是0。
第五碗飯他已經很飽了,價值是負的,如果要他吃,還要給他錢才行
所以,當他還沒吃飯時,一碗飯的邊際效用是100,
吃了一碗飯時,一碗飯(也就是第二碗)的邊際效用是50
吃了兩碗飯時,一碗飯的邊際效用是10
吃了三碗飯時,一碗飯的邊際效用是0
吃了四碗飯時,一碗飯的邊際效用是 -10....以此類推..
大部份的時候,邊際效用都是越來越小的,包括錢也是。
想想看,如果某人有一千元,
他的第一個一百元,會去買對他來說最有價值的東西
第二個一百元,次之
第三個一百元,再次之
一個直覺的想法是,同樣是一萬元,對我的效用比對王永慶的效用大多了。
因為我的一萬元是第一個一萬元,而王永慶的一萬元是第N個一萬元 (N很大~)
所以,既然錢也是邊際效用遞減的,
財富的平均就很重要了。
一千元分給一千個人,每一塊錢都是第一個一元,
可是一千元集中在一個人身上,只有一塊錢是第一個一元
其他999元的價值就越來越小.........
有了邊際效用遞減的概念
就可以導出經濟學最基本的定理---
需求法則: 價格越高,需求量越低。
蘋果漲價,買的人就少了,蘋果變便宜,買的人就多了
蘋果可以代換成:汽車、房子......等等
讓我們來細部一點的解釋這個情形:
假設第一顆蘋果對小明的「價值」是10元
           二                                               9元
           三                                               8元
           四                                               7元
那麼很明顯的,當蘋果的「價格」是10元時,小明會買 1 顆蘋果
                                                              9                           2
                                                              8                           3
                                                              7                           4
所以,當蘋果的「價值」等於「價格」時,小明會停止購買。
價格在經濟學上有一個更理論的名詞:成本。
蘋果的價格,不就是小明多得到一顆蘋果的成本?
所以我們可以這麼說:
當多買一顆蘋果給小明帶來的效用等於小明多買一顆蘋果的成本時,
小明會停止購買。
區分一個東西的價格和價值,對我們瞭解這個世界有點幫助。
一小時從高雄到臺北是坐飛機的價值,1860元是它的價格。
公司未來的獲利能力是股票的價值,股票指數是它的價格。
讓自己未來的薪水高一點是念大學的價值,四年的光陰和學費是它的價格。

2012年7月18日 星期三

20120718-結算

7月:
選擇權獲利:919.8點 / 44742(含手續費)
期貨-避險成本:0
期貨-當沖損失:-6189
共獲利:44742 - 6189 = 38553
報酬率:38553 / 720000 = 5.3%
image
8月:
避險:
指數7600==> BUY 二口小台
指數7800==>
指數6400==>
指數6200==>SELL 一口小台
交易計畫:
指數8100==>
指數7900==>
指數7700==>
指數7500==>
指數7300==>
指數7100==>
指數6900==>SELL 6400P一口
指數6700==>
指數6500==>
指數6300==>
指數6100==>
指數5900==>
9月:
避險:
指數7500==>BUY 一口小台
指數7900==>
指數6500==>SELL 二口小台
指數6300==>
交易計畫:
指數8100==>
指數7900==>
指數7700==>
指數7500==>
指數7400==>SELL 7700C 二口
指數7200==>SELL 7500C 一口
指數6900==>SELL 6300P 一口
指數6800==>SELL 6300P 一口 / SELL 6100P 二口
指數6600==>SELL 6300P 二口 / SELL 6100P 二口 / SELL 5900P 二口
指數6300==>
指數6100==>
指數5900==>
目前部位:
8月: 
image

9月:
image    

2012年7月15日 星期日

感恩帶來富裕的人生

朱子治家格言上說:「一粥一飯,當思來之不易;半絲半縷,恆念物力維艱。」目的就是要讓我們懂得感恩和節儉。時時懷著感恩的心是一種善良的美德,也是一個做人的基本條件。

知足的人都懂得感恩,能對一花一草、一山一水都表示謝意的人,他的人生必定是豐盛而富足的。

美國某城市有一位史蒂文斯先生,有一天突然失業了。他是一個程式員,在軟體公司做了 8年,他一直以為將在這裡做到退休,然後拿著優厚的退休金頤養天年。

然而,公司卻突然倒閉了。史蒂文斯的第 3個兒子剛剛出生,重新工作迫在眉睫。然而一個月過去了,他沒找到工作。除了寫程式,他一無所長。

終於,他在報上看到一家軟體公司要招聘程式員,待遇不錯。他拿著履歷,滿懷希望地趕到公司。

應聘的人數超乎想像,很明顯,競爭將會異常激烈。經過簡單交談,公司通知他一個星期後參加筆試。憑著堅實的專業知識,筆試中,他輕鬆過關,兩天後面試。

他對自己 8 年的工作經驗無比自信,堅信面試不會有太大的問題。然而,考官的問題是關於軟體業未來的發展方向。這些問題他竟從未認真思考過,因此,他被告知應聘失敗了。

史蒂文斯覺得公司對軟體業的理解,令他耳目一新。雖然應聘失敗,可他感覺收穫不小,有必要給公司寫封信,以表感謝之情。

於是立即提筆寫道:「貴公司花費人力、物力,為我提供了筆試、面試的機會。雖然落聘,但通過應聘使我大長見識,獲益匪淺。感謝你們為之付出的勞動,謝謝!」

這是一封與眾不同的信,落聘的人沒有不滿,毫無怨言,竟然還給公司寫來感謝信,真是前所未聞。

這封信被層層上遞,最後送到總裁的辦公室。總裁看了信後,一言不發,把它鎖進抽屜。

3 個月後,新年來臨,史蒂文斯先生收到一張精美的新年賀卡。

上面寫著:「尊敬的史蒂文斯先生,如果您願意,請和我們共度新年。」賀卡是他上次應聘的公司寄來的。原來,公司出現空缺,他們想到了品德高尚的史蒂文斯。

這家公司就是美國微軟公司,現在聞名世界。十幾年後,史蒂文斯先生憑著出色的業績一直做到了副總裁。

雖然人人都知道感恩是一種美德,然而在一個日益商品化和市場化的社會中,在一個金錢變得日益無所不能的環境內,我們似乎正在忘記感恩。

如果 以感恩的心態面對一切,即使遭遇失敗,人生也會變得異常精采。感恩是富裕的人生,它是一種深刻的感受,能夠增強個人的魅力,開啟神奇的力量之門,發掘出無窮的智能。

感恩,是幸福的起點,也是奮進的源泉。因為感恩,所以惜緣、惜福。時時懷著一顆感恩的心,最大的受益人不是別人,而是自己。

2012年7月12日 星期四

成功必修課:學做人

轉自成功必修課:學做人

這堂課,課本沒教,老闆、同事不會直接講。這堂課,沒有文憑,無法畢業,許多人學一輩子都學不會。這卻是職場上最重要的一堂課:「做人」。

做事要緊,還是做人優先?做「好人」還是做「自己」?「人緣好」,會不會變成「濫好人」?為什麼有人總能廣結善緣,有人卻老是處處樹敵?這些帶給你無窮煩惱、卻找不到答案的難題,《Cheers》雜誌透過各種過來人的親身經驗,為你淬煉出通過考驗的人生智慧。

只要釐清困惑,掌握原則,做人其實沒有那麼難。

做人難!上海皇帝杜月笙曾說,人生有三碗「面」難吃,一是場面,二是錢面,三是人情面,其中,最難吃的正是人情面。

偏偏這碗難吃又難捧的「面」,在學校往往沒人會教,出了社會又沒人敢教,於是,我們得憑本能,不斷在人情困境中,學會做人的能力。

儘管不容易,但並非沒有脈絡可尋。只要你能先釐清關於做人的幾項大哉問:比方說,到底是做事重要,還是做人重要?

做事,還是做人?

很多剛進職場的年輕人,仗著聰明才智,總覺得「實力決定一切」,做人不重要。對於不如自己的人,不是當面嗤之以鼻,就是在背後抱怨。

甫接任美商聯邦快遞公司台灣區總經理一職的朱興榮,回想11年前,自己就曾經犯了這個「每個聰明人都會犯的錯」。

當時從美國念書回來,擔任小工程師的他,每天只管窩在自己位置上,按時間完成專案即可,根本無須搭理其他同事,更遑論跨部門的合作。

因為專業表現亮眼,受到當時的總經理陳嘉良(現為聯邦快遞中國區總裁)器重,朱興榮被點名擔任一個囊括國內外中高階主管的跨部門專案主持人。

一向是「拼命三郎」的朱興榮,過去工作有瓶頸,頂多熬夜加班就能過關,沒想到這次卻栽在一個他眼中,緊要關頭只會「推脫」的主管身上。

他記得,當時專案流程出了問題,整個團隊必須24小時進駐,體力、壓力都不堪負荷,還要召開應變會議。

就在會議進行到一半,心力交瘁到臨界點的朱興榮,又聽到那位讓他「感冒」已久的主管,沒有辦法又抱怨不休,他一時難掩怒氣拍桌大喊:「這件事溝通很多遍,不知道到現在為什麼還不做,如果有人不想做,這個專案也不用繼續了!」

隨即,這位只有兩年資歷的毛頭小子,竟然當著眾多高階主管的面,天塌下來也不怕似地甩門而出。

拿針戳人,還是拿針縫衣?

直到深夜12點半,呆坐座位已久的他,感受肩上一雙手的重量搭來,轉身只見堆滿笑容的陳嘉良緩緩說:「你啊,就像一根針,戳人會痛啊!若把這個針拿來縫衣服,就會很有功效,不知道你為什麼要去戳人?」

「不是我要戳人,是他逼著我去戳人,我受不了!」朱興榮氣憤地說。

陳嘉良接著回應:「喔,因為你受不了,所以你就不去縫衣服,而去戳人?我知道你心裡很多委屈,在這個時刻,你若能把所有精力拿來縫衣服,大家會更感激你!」

朱興榮笑著說,當時自己一心想把事情做好,產生盲點,陳嘉良這番「戳人與縫衣」的道理,讓拘泥在「你錯我對」節骨眼的他,頓時心門大開:「與其當場讓他難看,不如直接向他伸出援手,把事情解決了更有效率。況且,若我坐了他的位置,不見得能做得比他好!」

從小一路順遂,自我要求極高的萬事達卡國際組織資深副總裁暨中國區總經理江威娜,同樣也歷經不會做人的青澀歲月。

初入職場:80%做事,20%做人

回想剛入社會前幾年,她曾為了打入同事的午間閒聊,無意間「貢獻」了話題主角的一些私人祕密。

當時專注做事的她,忽略辦公室常有的角色競爭,此番被有心人炒作的「爆料」,不僅傷害了當事人,毀了友誼,更讓她重新思索做人的道理。

一般而言,年輕人容易陷入「做事」比「做人」重要的思考,因為做事的目標明確,短期即可見真章,投入與回饋十分直接。

反之,做人得面對「一樣米養百樣人」,不同角色的適應與考驗,講究的是長程的累積,無法立竿見影,且隨著職位升遷,扮演的角色趨於複雜,難度還愈來愈高。

「在投資報酬率的權衡下,做人的重要性常常被視而不見,」江威娜分析。

她語重心長的提醒,要想出類拔萃,職場上的確存有做事與做人的「比例原則」。

初入職場前5年,至少要花80%的力氣在學做事,另外的20%花在學做人上。隨著工作技巧日漸熟練,做事所需的時間減少,就要調高比例,將更多的注意力,花在做人的學習上。「當同儕還在斤斤計較做事的方法,你卻能開始展露做人的本領,帶領團隊解決問題,就很容易在這個階段變得耀眼,」江威娜強調。

二個令許多人困擾不已的難題,是做人,還是做自己?

做人,還是做自己?

雖然知道做人重要,但一想到為了和諧,得委曲求全,隱藏自己的本性,就讓人痛苦不已。

「外圓內方」這句被中國人奉為做人最高境界的成語,在德州儀器半導體技術公司大中國區總經理郭江龍看來,即是最好的答案。

他解釋,所謂「外圓」,指的是顯露在外的態度行為,講求的是「圓融」、「和氣」;「內方」,則是指隱於內心的原則信念,譬如「正直」、「誠信」,扮演最後一道防線,不會因壓力或環境改變而棄守。

一般人常誤解「外方內方」或「外圓內圓」的「表裡如一」,才是真正做自己。即便如此,所謂「表裡如一」,也不是隨興所至的任意妄為。

表裡如一新解

《記得你是誰—哈佛的最後一堂課》中「表裡如一」一文指出,所謂「表裡如一」,指的是不必為了做人而徹底放棄自己,而是該懂得如何區分私底下與工作時的自我,以維持一種「身分」的平衡。

他認為,你可以在公、私生活中拉上一道紗簾,而非一堵無法穿越的磚牆,以方便隨時互通,又能區隔彼此的差異。

一旦懂得角色轉換,熟練地穿越這道紗簾,就不必放棄自我,變成雙重人格。有趣的是,愈能善用這個方法,愈能擁有獨特的優勢:一是在職場上,因為不背離本性,往往能展現某種個人風采,博得最多信賴。

當你回到私人領域時,你能做你想要的自己,家人與朋友對你真實的回報,更能平衡你在職場的情緒起伏,成為你的後盾。

不管是從「方」到「圓」的琢磨,抑或是「內」「外」自我的轉換,為避免過猶不及,究竟分寸該如何拿捏,往往是做人最難的地方。

做人,並不等於要做「濫好人」。

做好人,還是做濫好人?

廿一世紀公關顧問公司總經理俞竹平認為,以情緒管理的角度來看,若把自己磨得太圓,常會讓人覺得城府很深,有一種不可親近的感覺。

就像瓷器與陶器同樣是容器,但瓷器講究上釉,光可鑑人,卻只能供在高處欣賞。反之,陶器刻意留下手紋,少了完美的光澤,卻多了一種性格上的天真。

但最為人詬病的是怕得罪人,只知一味討好,成為不知原則為何物的「濫好人」。

濫好人落得兩面不討好

引進「卡內基訓練」,嫻熟溝通的黑幼龍,分析人際關係的模式,有以下4種狀況:

第1種狀況,叫作「操縱」,這類人想的是自己的益處,佔別人便宜,當別人知道吃虧時,就會離你而去。

第2種狀況,叫作「退讓」,這類人誤會好的人際關係是靠讓步,所以願意自己犧牲,讓別人佔便宜。虧吃多了,久而久之,也會漸漸脫離人群。

第3、第4種分別為雙方都倒楣的「兩敗俱傷」,以及互相拉抬的「雙贏」。

別以為當個濫好人,什麼都說好,什麼都慷慨答應,就能獲得好人緣。

黑幼龍指出:「濫好人的下場,就是第2種人際狀況,沒有原則的結果,不是為兌現承諾而過勞死,就是被追債的人逼得逃之夭夭!」

台達電子人力資源資深處長倪匯鍾回想,過去在飛利浦半導體顯示器事業部15年間,參與不少次決定高階接班人的會議,一字排開的候選名單中,每個都是過關斬將的佼佼者。

激烈的評選過程,彷彿《誰是接班人》的生死大會現場,全球大老闆與人資高階主管比鄰而坐,逐一討論歷年來績效考核的報告,「常常被判出局的,不是做事能力較差的人,而是大家口中的『濫好人』!」

nice guy≠right guy

在老闆口中,簡單一句“He is a nice guy, but not the right guy for this position.”(他是個好人,但坐這個位置他不是對的人),乍聽起來客氣,言下之意是「公司不是迪士尼樂園,你只有好人緣,不代表你成了領導者,就會懂得該硬則硬,遑論激發員工潛質,展現組織的戰力!」倪匯鍾強調。

到底做人應該朝哪些方向學習,才能突破現在的格局?抱著「不計較」的態度是第一步。

不計較,就像別在襟上的鮮花,能讓近悅遠來,無形中增加做人的廣度。

不計較,增加做人的廣度

江威娜曾經碰到一位既聰明、學習能力又強的人才,他在同儕中非常突出,本來是江威娜亟欲培養的幹部。沒想到幾次參與團隊合作,他最在乎的只是自己能享有的資源與利益,而非對團隊的貢獻。

江威娜不免感到失望:「一個不談付出,只會計較的人,難保到高位,他不會為了個人私利,犧牲整個團隊的利益。 」

其次,少了包容的心,若他當上領導者,肯定做不好coaching(教練)的工夫,無法帶領團隊中的落後者。

「若他一直沒有察覺,也不願意改,即使讓他獨立作業,因為個性,也會很快遇到工作瓶頸而離開,淪落職場流浪一途,」江威娜斷言。

位居高階,若能有不計較的胸襟,除了增加自身的高度,也會感染員工,成為效法的對象。

目前任教於高雄餐旅學校的前亞都麗緻總經理蘇國垚,對總裁嚴長壽就有如此的觀感。

一次兩人共同出差到夏威夷,投宿的是全球赫赫有名的頂級旅館哈蕾柯蘭妮(Halekulani),一路上嚴長壽如數家珍地對這家旅館讚不絕口。

Check-in後進房,蘇國垚被眼前擁有大客廳、大浴室,還有夏威夷絕佳海景的房間所震撼。他念頭一轉,總裁的房間一定會更驚人。

沒想到,敲門後推開一看,竟然面積著實小了三分之二,更無景觀可言,他不禁大驚失聲:「他們竟然把房間弄錯了!」

只見嚴長壽笑著說:「我已經住過了,你出差很累,這算是慰勞,就好好在裡面體驗一下。」並堅持讓蘇國垚連續住了兩夜。

即使已離開亞都麗緻多年,這段為蘇國垚津津樂道的小插曲,在旁人忙著計較的當下,總會出現腦海,讓他若有所悟地會心一笑。

謙卑的力量

「稻穗愈飽滿,腰彎得愈低」、「竹子愈高,竹尾彎得愈低」這些大自然的道理,講的正是「謙卑」的重要。

因為謙卑,你會居安思危,你會小心翼翼,你會拼命學習,你也會努力改變。最後,你擔心的事會消弭不見,你的弱點也能補全,你意料不到的收穫也會在謙卑中獲得。

只是愈在高峰,人愈不容易察覺謙卑的力量。霸菱證券投顧公司總經理陳詩舜就指出,金融圈充滿大起大落,曾經睥睨一切,如今落魄失意的例子,可說俯拾皆是。

他舉一位知名的金融新貴,靠著「向上管理」,頭銜一路竄升。對下屬極為傲慢的他,享受平步青雲的快感之餘,卻忘記自己已「掏空」多年奧援他的專業團隊。當他隨跳槽水漲船高,隻身就任遭遇困難,才發現自己能力有限,但身邊已無人願意伸手協助,屢次被新老闆「請走」。後續工作轉換,更因reference check(背景調查),不斷栽在他過去得罪的人的負面評價裡,而一蹶不振。

厚道,做人更高境界

在謙卑之外,若能做到厚道,先一步替人著想、留餘地,才真正是跨越做人更高的境界。

曾遭遇1997年亞洲金融風暴,從公司因跳票瀕臨倒閉,到如今谷底翻身,稱霸台灣精密機械業的台中精機就是一個好的例子。

經營超過50年,第二代接棒經營的台中精機總經理黃明和指出,早年客戶多是師徒相傳的黑手業,在工廠裡待了3年,就能出師自己創業。

黃明和的父親看這些年輕人在創業初期,難免資金短缺,總會大方地要他們先將設備拿去用,日後慢慢分期付款即可。甚至,有的下游經銷商沒錢進貨,他還會勸他們先把機器拿去賣,先賺了第一筆錢,才能打好基礎。

黃明和指出,由於父親總會替人著想,培養的許多客戶都是從第一代祖父輩開始,第二、第三代接手買新的機器,演變成關係深厚的三代交情。其中,還包含夫妻檔、兄弟檔、父子檔。

沒想到父親以厚道待人,後來竟救了黃明和與自己公司一命。

黃明和回想8年前,受亞洲金融風暴波及,國產汽車、東隆五金陸續爆發地雷股危機,中部地區許多上市公司都垮了,台中精機也因財務槓桿過度操作,20億元融資遭銀行凍結,頓時陷入困境。

奇妙的是,當遭逢相同命運的同業如楊鐵,早已被協力廠商拉白布條、圍廠鬧上電視新聞,台中精機卻顯得異常平靜。

不僅客戶沒有拋棄,協力廠照常提供零件,面對同業挖角,台中精機的高層主管沒有一個異動,一起度過了最艱難的階段。

黃明和心有所感地說,從此他深刻體會到「天助自助者」的道理。

做人的王道

76期 做人的王道

他強調,「自助」兩字,就是過去你所積的陰德,對他而言,也就是父親打下人情的基礎,讓大家願意信任,才能贏得東山再起的機會。

人生的做人課,不僅沒有文憑,也不可能畢業,連當過英國首相的邱吉爾都承認,自己到了65歲,才悟出一些做人的道理。

但不管是管理、領導、乃至於人生真正的成功與圓滿,沒有一項不是圍繞著「如何做人」。這堂最重要、也最容易被忽視的課,你學好了嗎?

學會選擇,面對挫折

轉自學會選擇,面對挫折

如果阿拉丁神燈能許的願望不是3個而是100個,你有多少願望要許?如果有1,000個工作機會等你來挑,你要選哪一個?如果這100個願望都落空、1,000個工作履歷都被退回,你有從挫折中復原的能力嗎?

在資訊爆炸的時代、壓力高漲的氛圍中,每個人都必需具備在有限時間內做出最明智選擇的能力,同時還要能承受來自四面八方的挑戰與挫折的復原力,否則工作將淪為失去歡笑的一樁苦差事。

工作人新能力1:選擇的能力

從選擇工作開始練習

你什麼時候會想換個新工作呢?似乎從開始工作的第一天就開始尋找下一個工作機會了。

也許你可以想一想:「我要在哪兒工作?」和「我要做什麼工作?」這兩個難題永遠沒有解決的一天,沒有一件事可以定案,人總會伸出觸角不停尋找更新更好的機會。於是如何選擇,選擇什麼的問題就隨之而來。

選擇愈多到底是好還是不好?以工作為例,從你踏進職場的第一天起,我們就開始問一堆問題:你想為誰工作,為誰效命?這個問題似乎是我們每天都要重複演練的選擇題。

在美國,32歲的就業人口中,平均每人待過9間不同的公司。幾年前在一篇關於美國職場流動性的文章當中,《美國新聞與世界報導》(U. S. News and World Report)估計:在1999年,有1,700萬美國人想換工作。有些人為了更高的薪水或更好的晉升機會而換工作,有些人換工作只是因為想住在不同的城市,有些人覺得現在的工作很無聊所以想換跑道。

換工作的確已經變成天經地義的事,如果有哪個人肯為一位老闆賣命長達5年,大家就會用懷疑的眼光看他,非但不認為他忠心耿耿,反倒會質疑他的能力和志氣。

工作流動性提供不少機會:可以自由變換環境,可以換個老闆、甚至換個工作領域,提供更多挑戰及充實自己的機會。

雖然好處不少,不過得付出相當大的代價,每天必須要蒐集資訊,然後做出抉擇,於是乎換工作變成沈重負擔。而在達成目標之後,也不能停下腳步享受自己的成就,為了下一個更好的工作機會,必須永遠保持備戰狀態。

體認選擇的弔詭

能夠有機會為自己做抉擇,對我們的幸福與身心健康有很重要的影響。不過,抉擇也有一些負面影響,而且隨著抉擇的增加,這些負面影響也跟著擴大。

表面上看來,面臨抉擇時選項很多是件好事,不過在這其中,我們所要付出的成本卻在不知不覺中累積起來。換句話說,導致這些問題的產生,並非來自某一項特定的抉擇,而是由全部的選擇共同造成。

要放棄可以選擇的機會並不容易,關鍵在於你必須要了解,對你而言,最重要的不是抉擇的客觀結果,而是主觀結果。即使你有幸選到較好的汽車、工作或假期,抉擇的過程常常讓人對自己的抉擇產生較負面的情緒,你並沒有真正地從這次選擇的機會當中得到什麼。

了解真正重要的是什麼

要解決過量選擇所帶來的問題,你必須要先決定,在生命中,哪些才是真正重要的,然後將時間和精力集中在這些選擇上,放棄其他的選擇機會;確定自己所要的,就能放下第二志願。藉著減少選項,就可以減少選擇的數量,而得到比較正面的情緒。

練習評估做一項抉擇時付出了多少成本,也許你會因此放棄其中一些選擇,或是為自己訂立法則,規定自己可以考慮的選項數量,或是可以投資的時間和精力。

做決定是件困難的事,而每個決定各自有不同需要考慮的因素。舉例來說,當你想租公寓的時候,你會考慮公寓的地點、寬敞與否、環境、安全設施,以及租金高低。當你想買車的時候,你會考慮安全性、穩定性、省油程度、車型,以及價錢。當你想找工作時,你會考慮薪水、地點、前景、可能會接觸的同事,以及工作本質。

明智的決定通常包含以下步驟:

1.認清目標。

2.衡量每個目標的重要性。

3.列出可供選擇的項目。

4.衡量選項是否符合設定的目標。

5.篩選出一個最理想的項目。

6.之後,再以所選擇的後果,修改原目標、重新設定重要性,以及評估未來可能的結果。

做決定不是件容易的事,就算選項只有寥寥數件也一樣。若選項增加,就必須花更多精力。這也就是選擇之所以會從一件美事變成一場惡夢的原因,就因為如此,我們不可能每次都能做出明智決定。

做明智抉擇的第一個步驟,就是要充分認清目標。不過,在你做正式的抉擇之前,首先要選擇的是:你的目標。是要做出絕對完美的(the absolute best)選擇?還是只想要夠好就好的(good enough)選擇?

《只想買條牛仔褲——選擇的弔詭》一書作者貝瑞.史瓦茲(BarrySchwartz)提出「第二級選擇」的概念,教你如何思考「選擇」這件事,因為有時候多未必好,夠好就好。

書名:《只想買條牛仔褲——選擇的弔詭》(TheParadoxofChoice)

作者:貝瑞.史瓦茲(BarrySchwartz)

出版社:天下雜誌

定價:320元

工作人新能力2:面對挫折的能力

你可以決定要不要面對

這項能力能讓我們在遇到生活、工作、情感等各種壓力與不如意時以正面積極的態度面對。而你就是那個擁有主控權,能決定要不要面對挫折、如何面對挫折的人!

修改負面腳本

你曾經發現自己不斷重複著同樣的行為,卻適得其反嗎?

有很多人每天重複著相同的行為,得到一樣的反效果,就好像演員排演一樣,跳脫不了腳本的編排。

當我們的行為只會帶來反效果或是失敗,但我們卻持續進行時,這就是所謂的「負面腳本」,這些負面腳本會影響到我們生活及工作的各個層面,是阻礙我們培養挫折復原力的障礙。

兩位美國最知名的臨床心理學家布魯克斯與戈爾茲坦博士在《天下》雜誌出版的《挫折復原力》一書中,用真實案例喚起讀者的感同身受,並提供具體的步驟與方法,教我們如何培養、加強「挫折復原力」這項特質,擺脫阻礙改變的「負面腳本」。

擁有挫折復原力的10個要素

1.改變生活:更改負面腳本。

2.選擇抗壓,而不是被壓力擊垮。

3.用別人的觀點觀察生活。

4.有效溝通。

5.接納自己及他人。

6.貼近他人及發揮憐憫心。

7.有效處理錯誤。

8.培養特長,欣然面對成功。

9.訓練自律及自制力。

10.維持心智堅韌的生活型態。

誰能領高薪!

51期 誰能領高薪!

書名:《挫折復原力》

作者:羅伯特.布魯克斯博士(RobertBrooks,Ph.D.)、

薩姆.戈爾茲坦博士(SamGoldstein,Ph.D.)

出版社:天下雜誌

定價:380元

除了語言能力、運用科技的能力、溝通能力、學習能力、應變能力,以及選擇的能力外,想想看,如果你是面試的主考官或是部門主管,你還會加上哪個指標來評估錄取誰或者選擇誰當接班人?

目前企業界所重視的新能力莫過於「挫折復原力」。因為面對隨時會冒出頭的壓力與挑戰,現代的工作人必須具備的第二個新能力就是從逆境中快速站起來的能力。

生活當中,總是會遇到大大小小波折和難題,為什麼有些人可以輕易應付生命中的重大考驗,但是有人卻連最小的挫敗也無法承受?關鍵就在於是否擁有「挫折復原力」。

一個人有「挫折復原力」並不表示他就感受不到任何壓力及衝突,而是他更知道問題發生時如何在逆境中自處。

所謂挫折復原力,就是當你對生活有所不滿,或是發現自己的行為或言談常讓你感到失望、憤怒、不悅時,你必須主動修正造成這些問題的負面腳本,即使必須勇敢跳脫長久以來看似安全的安適區,也不能忽略夢想及理想的追尋。

你輸了、你好笨!「蠢問題」情境大公開:上班族不能犯的4種錯誤

轉自你輸了、你好笨!「蠢問題」情境大公開:上班族不能犯的4種錯誤

他的「問題」,小至幫助學生主動寫功課,大至改變人的思考面向,進而影響人生。擅於「問問題化於無形」的許添盛,靠的不是技巧,而是回歸尊重和真誠。

「叔叔覺得你一定不是故意不寫功課,是遇到困難了對不對?」

小朋友默默點了點頭。

「你一定也希望老師喜歡你,會嗆老師,可能是他沒顧到你的尊嚴,無形中得罪你了是嗎?」

「對,」小朋友像遇到知音,眼淚都快掉下來了。

「發生了什麼事,要不要說說看?」

沒有責備,沒有說教,也沒有情緒,這是賽斯身心靈診所的諮商室裡常會出現的相似提問場景。很多人因為這樣細膩的問題,卸下心防,開始對話,開始改變。

示範提問的是院長許添盛,他的本業是身心科與家醫科醫師,不少人卻是透過演講而認識他。他的演講行程遍及台灣、香港、紐約、多倫多等,四處推廣身心靈療癒,多年來改變了很多人的生命。

因為聽了演講深受感動,進而應徵成為許添盛特助的林娉如回想,8年前的她個性比較悲觀,但受到許添盛的影響,現在的她自在許多,「很多時候也不會(負面思考)了,」林娉如說。

在許添盛的部落格上,經常有網友感謝他為他們所帶來的改變。是什麼樣的力量,可以讓他影響那麼多人?

錯誤一 只問不聽》說服別人的不只嘴巴,還有耳朵

許添盛非常擅於提問,但光是「問問題」不夠,他的體會是:還要加上「隨時準備好要聽」。

因為工作關係,許添盛幾乎每天都要面對行為偏差、心理狀態不佳或人生面臨困惑抉擇的求診個案,引導他們找出解決之道。

多數時候,許添盛不會告訴當事人答案,而是讓他們自己找解答。他最常做的事,就是丟出一個簡單的問題,用心傾聽,再以對方的回答為基礎,提出下個問題。「我問過最多次的問題就是:『你要不要再多說一點?』」許添盛笑著說。

「很多人以為我口才很好,很會說服別人,其實不是。」他接著解釋:「真正說服別人的不是嘴巴,而是耳朵。我只是藉由問問題,來讓對方說話。當他覺得被聽見,心裡已經好一半了。」

因此,雖然在演講台上口若懸河,但私底下的許添盛並不多話,透過一個看似平淡的問題,讓對方產生共鳴,開始說話後,他就把大部份時間拿來「聽」。「多數人其實不是沒準備好要問,而是沒準備好要聽,」他有感而發地說。

當然,傾聽只是提問者必備的態度,問題還是得問得巧妙,才能降低被問者的抗拒心理,順著你的脈絡回答,達到你想要的效果。

錯誤二 強迫對方接受》改變別人最快的方法:同理他

好問題要以同理心為基礎,抓住對方的感受來提問。一般來說,人只有覺得自己獲得理解後,才會願意坦誠回答問題。

許添盛曾遇過一對夫妻,丈夫賺了很多錢,錢都歸太太管,但丈夫好賭,常需要太太拿錢還賭債。兩人為此吵得不可開交,找上許添盛求助。

許添盛私底下問那位先生:「你去賭博,一定有得到情緒的抒解,你都抒解了哪些情緒?」

「我心裡很多不滿時,就會去賭博。」

「心裡有不滿,要不要說說看?」

「我賺了那麼多錢,太太都不讓我花。我就去賭博,讓她把錢吐出來。」

「這樣啊,但輸掉的是你的錢,並沒有回到你的口袋裡,反而都不見了,我實在想不通這個邏輯,你可以解釋給我聽嗎?」

問著問著,最後,這位先生自己說出:「我這個行為真是滿傻的。」

仔細看這段對話,許添盛雖然想幫助對方戒賭,但他絕口不提,只是從頭到尾站在與對方同理的角度,對方的接受度反而更高。「你不要說他傻,要讓他自己說出這句話,」許添盛說道:「改變別人最快的方法,就是同理他。」

換言之,當你想說服或改變一個人時,不能只是希望他做某件事,而要先理解「為什麼他不做這件事」,再循序漸進地引導。

錯誤三 用字遣詞情緒化》溝通不夾帶指責,才能暢行無阻

此外,許添盛特別強調,問問題時最怕夾帶著情緒與指責。人際之間,常因對話充滿批評與責難,使得雙方如同進行攻防戰,無法真正溝通。像是「你為什麼不念書?」「你為什麼那麼晚回來?」「你不覺得這件事很丟臉嗎?」等,都是用情緒問問題,只會激起對方的不滿,讓對話無法持續下去。

許添盛坦言,他幫個案做諮商時,當然會有自己的意見與想法,也希望幫對方帶來一定的改變。但是,「我的意見是藏在後面,不是表面。」他說:「我不會讓對方認為我在任何地方對他提出質疑。」

他以燈號來形容,最好的提問方式是讓對方願意一直講,「一路亮綠燈」。「問問題若能一路綠燈,就能一路問出你要的東西,」許添盛直言。

錯誤四 取巧耍心機》真誠引導,而非事先「設局」

熟稔運用提問技巧幾乎已成為許添盛的本能,但他使用的語言並不難,國台語夾雜,時而逗趣,時而幽默。甚至,他還隨意示範了一個如何讓殺人犯吐實的問答。「我看你一定不是故意要殺他的,你一定是非常的生氣吧?」「對,我真的是太生氣了……」一句話就問出了實情。

林娉如表示,長期和許添盛共事,特別能感受到他的這種功力。「他的問題很自然,感覺就是化於無形。」林娉如回憶道:「曾經還有個老師說:『沒跟在許醫師旁邊做個案,不知道水有多深』。」

許添盛指出,多數人其實也都可以靠訓練、憑經驗來鍛鍊提問力。不過,他也點明,提問主要的目的是引導對方思考,讓他自己做出決定,而不是「一個事先設好的局」。因此,有時「他們做出的改變,不一定跟我們要他們做的改變一樣,要有寬廣的腹地可以接受才行,」他提醒。

總之,藉由問題來說服、引導,不能只落於技術與技巧,那就本末倒置。「出發點是真誠,最後還是要回到真誠,」許添盛做下最好的詮釋。

心理醫師教你3招人際好提問

問出好問題的威力

142期 問出好問題的威力

● 遵循守密原則,不要把兩人之間涉及私人或敏感的問答內容告知他人。

● 注意遣詞用字,每個字都有不同的心理感受度。例如,「你會不會覺得這件事你輸了?」聽起來就比「你會不會覺得這件事有缺點?」來得刺耳。

● 對於健談的人,要問開放性的問題;話不多的人,則要問他封閉性問題。

科技業加薪15%!戴勝益:不能管理數字,別談加薪、升遷

原文轉自:科技業加薪15%!戴勝益:不能管理數字,別談加薪、升遷

科技大廠紛傳加薪,企業最高可能有15%的加薪幅度,想要向上管理談升遷、加薪,該怎麼做?

戴勝益相信,所有事情都能用數字衡量,擁有數字敏感度更是經理人責無旁貸的義務,沒有數字概念不但無法做好領導,更不會是他培養拔擢的對象。台灣大學中國文學系畢業的戴勝益,為什麼這麼重視數字?一個經理人又要如何建立掌握數字的能力,還能正確採取行動因應?

上班族必懂關鍵1:為什麼數字很重要?

對我而言,所有事都能用數字衡量,包括企業營運、管理、個人健康,例如我每天走1萬步路,我認為「You can't improve , if you can't measure.」(你如果無法衡量,你就無法改進。)

上班族必懂關鍵2:在營運上,什麼是你必看的數字?

我必看的數字不是營收,而是顧客滿意度與顧客抱怨數。

王品每家店每天會收到100張顧客意見表,1個月共18萬張。顧客抱怨數是顧客撥打的0800客訴電話的通數,這兩項數據可反應顧客想法,作為分店改進依據。

例如,上個月全集團顧客抱怨數是107通,上上個月是每萬人次2.91通,從中可看出每家店的經營良窳。107通中,有一家店佔4通是最嚴重的,也有無抱怨數的店。

王品集團每個月都會計算業績、紅利,而且公開讓大家自己去看。數字好看,紅利就多,數字不好看,不僅大家紅利領得少,我也會發出警告,再這樣下去,你會丟掉這個品牌的總經理位子。

數字管理要公開、即時,而且當全部靠數字時,我就不用罵人,也不怕被蒙蔽。我的心得是,把公司交給顧客管理,把財務交給同仁管理。公開全部數字,每個人都能幫你檢視各部門的財務運用狀況。例如,之前總部幫分店添購補蚊燈,每台價格是2,200元,但分店去菜市場看才1,900元,就叫總部退貨,他們自己採購。

上班族必懂關鍵3:數字對企業的意義是什麼?

企業像坦克車,數字像坦克車上環環相扣的齒輪,只要一個齒輪脫勾,坦克車的鋁帶就會卡住,無法行走。沒有數字概念的公司,就像沒有齒輪的坦克車,當車子不運轉時,很難知道問題出在哪裡。就算運轉,也不知道還能運轉多久,所以數字能幫助我解讀各種必要的訊息。

上班族必懂關鍵4:應該如何培養對數字的敏感度?你有什麼建議?

就像進飛機艙,200多個開關,但開飛機要動的就那麼幾個。你不用心時,每天面對幾千個數字,就會覺得壓力大,但當你投入時,就會知道哪些是關鍵數字,只要記住這些數字就可以。

我最喜歡到每家店問店長:到今天為止,總計營業額是多少?或問主廚:你這個月打算做多少?今天的達成率多少?其中,西堤台南店主廚最有數字概念,到4月20 號,他就能算出他們4月的獎金是多少。他會直接告訴你:到現在營業額多少?到何時會有多少?貨款有多少?員工薪資又是多少?扣除成本後,這家店還剩多少盈餘?員工又可以分到多少錢?

當你習慣用數字思考,即使看到不好的數字也容易釋懷,不會有壓力,只覺得應該還要再做些什麼。最後,我要提醒經理人,數字管理要伺機而動,什麼數字要改變,什麼數字還在容許範圍內,可以go on,要給部屬明確的指示,才能用數字做好領導。

上班族必懂關鍵5:數字幫助你做哪些決策上的判斷

例如新餐飲品牌能不能做,有3項判斷指標:第1,要能做到5億市場。第2,品牌要能開到20家店。第3,獲利率須達到10%,假使這3項指標都能達成,這個品牌就能做。接著營運就朝「151」方程式發展,也就是投資金額1,000萬,1年營業額要達 5,000萬,每年要有1,000萬獲利,全部都有數字,部屬再評估可不可行。

上班族必懂關鍵6:你會把看過的數字都記下來嗎?

對。我為什麼愈來愈重視數字?因為我想授權,但我授權時,會擔心無法衡量這個人、這個事業做得好不好?所以我開始運用數字做管理。一個人處在安全期愈久,愈喜歡運用「營運正常」、「獲利不錯」、「士氣高昂」之類的形容詞,但對我而言,形容詞是無意義的,無法真實描述營運狀況。

我要求自己背住所有與產業、營運、工作相關的數字。每天上班第一件事,就是看前一天的數字報表,包括每個品牌、每家店的顧客滿意度、顧客抱怨數、營業額。即使沒有進公司也請祕書傳前一天所有品牌的營業總額簡訊給我,否則會心神不寧。因為沒有抓到前一天結帳後的所有數據,根本無法知道今天的狀況好不好。

上班族必懂關鍵7:每項制度都要用數字管理,會讓制度越來越複雜?

不複雜。只要寫好程式,這些數字都是電腦在計算,隔天一早就知道。而且數字會讓人心更純淨,組織、領導簡單化,以前要用形容詞、表面文章向大家證明,現在都不用做無謂的邀功。

上班族必懂關鍵8:數字是找到浪費的重要線索,但是到底什麼可以cost down,什麼不行?

去年10月,我看到外銷訂單量每年同期比從正成長變成負成長,就開始擔心王品今年的營收將受影響,於是去年底做2009年的cost down計劃,每個部門都要認養金額,總目標是節省1億5千萬元,而且每個月追蹤各部門的數字達成率。

cost down原則是:第1,輕重緩急剛好,不能用力過大。第2,不能看短不看遠,例如不做教育訓練可省幾千萬,但這會影響服務品質,是看短。第3,要讓同仁有警覺,而不是有威脅,否則會影響士氣,員工對客人的服務態度變差,反效果就會出現在另一個數字(營業額)上。

為了cost down,員工也都參與提案,總共提出幾百件,我看到後,笑說:「若這幾百件都做,公司大概1個月就倒了,」所以什麼要做、不做仍要拿捏得宜。

就像每年的員工出國旅遊不能省,第一,這是王品的特色;第二,可以增加員工對公司營運的信心;第三,可降低異動率,透過福利讓大家覺得永遠有希望,才能留住好的人才。

但王品股東會就可以省。王品股東都是內部高階主管,以前都是股東加眷屬700多個人,浩浩蕩蕩搭高鐵到南部,包2家飯店度假,花費上千萬元。今年就變成1 天,照常開會,然後晚上聚餐,只花了20幾萬。這主要給基層員工一個訊息,我們沒省員工旅遊,反是省高階主管度假的費用。cost down若沒有精準得恰到好處,會產生更大的傷害。

這次cost down的最大成效是,企業關係部重新跟各分店的屋主議價房租。王品經營穩定,房東都願意配合,原本計畫減少2,000萬元房租,至今已議出4,000多萬元,估計未來將達到6,000多萬元。

上班族必懂關鍵9:但數字管理也可能產生盲點,譬如局限經理人做比較大膽的決策?

總比沒有數字好。如果進行新案子,沒有數字,等於是矇住眼睛走路。有數字,走10步路後掉下去了,至少還有依據。錯誤的數字也比沒有數字好,至少你還可以邊走邊修正那個數字的正確與否,完全沒有數字,隨時可能莫名奇妙就掉下去了。

你觀察其他企業無法落實數字管理的障礙在哪裡?

是老闆的問題,因為這個老闆不重視數字概念。

2012年7月11日 星期三

解決Excel2010插入圖片變成連結方式存檔

使用方法二可解決以下狀況

Excel 2010 插入圖片後, 發到收件人後, 圖片不能正確顯示, 只顯示"無法顯示連結的圖像"

//use  office2000,comobj;

procedure DBGrid3Excel(var DBGrid: TINFODBGrid;  ExcelFileName: string);
var  MyExcel: Variant;
     x,y, Z:integer;
     aGONO1:String;
     aPIC: Variant;
     iPic:Integer;
     aRange: Variant;

begin
  Z:=dbgrid.FieldCount;
  deletefile(ExcelFileName);
  MyExcel := CreateOleOBject('Excel.Application');
  MyExcel.WorkBooks.Add;
  MyExcel.Visible := True;
  MyExcel.WorkBooks[1].Saveas(ExcelFileName);
  dbgrid.DataSource.DataSet.First;
  MyExcel.Range['A1:N1'].Select;//選取一整行
  MyExcel.Selection.Merge;
  MyExcel.WorkBooks[1].WorkSheets[1].Cells[1,1] := Printstr;

  y:=2;
  for x:=1 to dbgrid.FieldCount do
  begin
    if dbgrid.Columns[x-1].Visible then
    begin
      MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,x] := dbgrid.Columns[x-1].title.caption;
      // 將該欄設為標選
      MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,x].Select;
      // 將標題欄位變粗體字
      MyExcel.Selection.Font.Bold := true;
      // 設定欄位寬度
      MyExcel.WorkBooks[1].WorkSheets[1].Columns[x].ColumnWidth := dbgrid.Fields[x-1].DisplayWidth;
    end;
  end;
  inc(y);
  iPic:=1;
  aGONO1:='';
  while not dbgrid.DataSource.DataSet.eof do
  begin
    for x:=1 to dbgrid.FieldCount do
    begin
      if  dbgrid.Fields[x-1].FieldName='PICNAM' then
      begin
          MyExcel.WorkBooks[1].WorkSheets[1].Columns[x].ColumnWidth := 19;
          MyExcel.WorkBooks[1].WorkSheets[1].Rows[y].RowHeight:= 53;//recycle
          if (FileExists(Pchar(dbgrid.DataSource.DataSet.FieldByName('PICNAM').AsString)))then
          begin
            MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,1].Select;
            //方法一
            aPIC:= MyExcel.WorkBooks[1].WorkSheets[1].Pictures.Insert(dbgrid.DataSource.DataSet.FieldByName('PICNAM').Value);
            aPIC.Select;
            //aPIC.ShapeRange.IncrementLeft(0);
            //aPIC.ShapeRange.IncrementTop(0);
            //aPIC.ShapeRange.LockAspectRatio := msoFalse; //圖檔大小LOCK          
            aPIC.ShapeRange.height:=50;//指定高度
            //aPIC.ShapeRange.Width:=50;
            //aPIC.ShapeRange.ScaleWidth:=0.5;

            //取消底色
            aPIC.ShapeRange.PictureFormat.TransparentBackground := 1;
            aPIC.ShapeRange.PictureFormat.TransparencyColor := RGB(255, 255, 255);
            aPIC.ShapeRange.Fill.Visible := 0;
                       
            //方法二 Shapes.AddPicture
            aPIC:= MyExcel.WorkBooks[1].WorkSheets[1].Shapes.AddPicture(dbgrid.DataSource.DataSet.FieldByName('PICNAM').Value, msoTrue, msoTrue, 0, 33+52.5*(y-3), 50, 50);

            //MyExcel.WorkBooks[1].WorkSheets[iSheets].Pictures.Insert(dbgrid.DataSource.DataSet.FieldByName('PICNAM').Value);
            //MyExcel.WorkBooks[1].WorkSheets[iSheets].Pictures.Insert('\\127.0.0.1\PICT\10WEG011001.jpg');
            //設定圖檔大小
            //MyExcel.WorkBooks[1].WorkSheets[iSheets].Pictures[iPic].ShapeRange.height:=200;
            //MyExcel.WorkBooks[1].WorkSheets[iSheets].Pictures[iPic].ShapeRange.width:=40;

            Inc(iPic);//記錄目前圖檔陣列
          end;
      end
      else if dbgrid.Columns[x-1].Visible then
      begin
        if dbgrid.Fields[x-1].DataType =ftString then
          MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,x] := ''''+dbgrid.Fields[x-1].DisplayText
        else
         MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,x] := dbgrid.Fields[x-1].DisplayText;
      end;
    end;
    inc(y);
    //aGONO1 := dbgrid.DataSource.DataSet.FieldByName('GONO1').AsString;
    dbgrid.DataSource.DataSet.next;
  end;
end;

以下節錄 Shapes.AddPicture 方法說明:
從已存在的檔案中建立圖片。傳回代表新圖片的 Shape 物件。
語法

ActiveSheet.AddPicture(Filename, LinkToFile, SaveWithDocument, Left, Top, Width, Height)

參數

名稱 必要/選用 資料類型 描述
Filename 必要 String 要建立 OLE 物件的來源檔案。
LinkToFile 必要 MsoTriState 要連結的檔案。
SaveWithDocument 必要 MsoTriState 要與文件一同儲存的圖片。
Left 必要 Single 圖片的左上角位置 (以點為單位),與文件左上角相對。
Top 必要 Single 圖片的左上角位置 (以點為單位),與文件頂端相對。

Width 必要 Single 圖片的寬度 (以點為單位)。
Height 必要 Single 圖片的高度 (以點為單位)。

傳回值 Shape

備註
MsoTriState 可以為下列其中一個 MsoTriState 常數。
msoCTrue
msoFalse :將圖片建立成獨立的檔案複本。
msoTriStateMixed
msoTriStateToggle
msoTrue:建立圖片與其來源檔案之間的連結。

MsoTriState 可以為下列其中一個 MsoTriState 常數。
msoCTrue
msoFalse:只在文件中存放連結資訊。
msoTriStateMixed
msoTriStateToggle
msoTrue:將連結的圖片與其所插入的文件一同儲存。如果 LinkToFile 為 msoFalse,則此引數必須為 msoTrue。