線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2417
推到 Plurk!
推到 Facebook!

關於 GetObject

 
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-05-31 09:53:38 IP:211.22.xxx.xxx 未訂閱
大家好, 請問一下大家, 下面這段程式碼的用意是什麼? 謝謝大家!
var lf: TLogFont;
begin
  GetObject(Edit1.Font.Handle, SizeOf(TLogfont), @lf);
  lf.lfWidth := 8;
  Edit1.Font.Handle := CreateFontIndirect(lf);
end;
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-06-01 23:13:55 IP:192.168.xxx.xxx 未訂閱
引言: 大家好, 請問一下大家, 下面這段程式碼的用意是什麼? 謝謝大家!
var lf: TLogFont;
begin
  GetObject(Edit1.Font.Handle, SizeOf(TLogfont), @lf);
  lf.lfWidth := 8;
  Edit1.Font.Handle := CreateFontIndirect(lf);
end;
應該是一些windows api的使用, 好像可以設定TEdit物件中顯字元的寬度用! 但程式碼看不太懂? ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-06-02 11:14:45 IP:61.59.xxx.xxx 未訂閱
最近正好在幫 geOShell 的 geOCommandTime 模組除錯,正好是 FONT 處理的 BUG,只不過 geOShell 是用 VC 開發的,所用到的都是 WinAPI。 GetObject() 這個函式在 geOShell 及其 plugins 中都很常見,可以用來取得現有模組中的字型、顏色、筆刷、等等的繪圖資訊。 只是沒想到在 VCL 中也可以這樣玩。 GetObject(Edit1.Font.Handle, SizeOf(TLogfont), @lf); 等於是由目前的 Edit1 字型中取得此字型的相關資訊, lf.lfWidth := 8; 就如同天使所說的,就是設字寬囉。 只是不清楚在 BCB 的 TFont 中沒有這個屬性嗎?(應該是沒有,不然就不用如此麻煩)。 Edit1.Font.Handle := CreateFontIndirect(lf); 是用 lf 建立一個 HFONT 再指回給 Edit1.Font 在 WinAPI 中,還可以用 CreateFont() 來建立 HFONT,不過這個 API 就要輸入一大堆的參數,對於現有字型用上述的方式可以快速修改其屬性。 ---------- 在此,我有一個問題,也許與此無關,就是在以上的程式碼中,這個 FONT 是在此 Create 的,在此模組/程式結束時,會自動 delete 嗎? 如果原本的 Edit1.Font 是使用 parent font,而 Edit1 在產生時也許是「共用」parent 的字型,那結束時自然不該去 delete。如果原本的 Edit1.Font 有自己指定字型,在結束時就會自己 delete,兩者工作模式不同。 當然,以上只是個人的猜想,並沒有詳細去看 VCL 原始碼,也許 VCL 在實作時已有考慮。 像 geOShell 的 geOCommandTime 是有多人開發,使用的是自定的物件及 WinAPI,而我所 fix 的 bugs 正好是使用 parent font 時把 parent font 給 delete 了!!
------
http://www.ViewMove.com
linkolong
一般會員


發表:4
回覆:35
積分:12
註冊:2002-04-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-06-02 14:10:06 IP:61.70.xxx.xxx 未訂閱
hagar其實這段程式之前我不曾用過,但在解釋此程式碼中,我反而更充實... GetObject當我在查詢其意義時,註解開宗明義的講這是一個圖形化物件,將物件圖形化,我們知道在Windows大部分物件皆由Handle管理,由系統負責建構,也由系統負責摧毀,當然GetObject所處理的物件也一定是Graphic物件,可參考本身其說明,因為要處理Font所以第一個參數指向Font.Handle,處理hFont,依說明需用TLongFont來存所取得的圖形化物件,第2個參數為分配對應之大小記憶體,第三個參數為TLogFont的指標型態,所以 GetObject(Edit1.Font.Handle, SizeOf(TLogfont), @lf); 更改TLogFont的值 lf.lfWidth := 8; {可解釋為將該圖形化物件(非字體因為此時已經為物件了)的寬度改為8} 將TLogFont組成HFont還原給Edit1; {此時透過CreateFontIndirect將物件還給HFont了} --------------- 引言 在此,我有一個問題,也許與此無關,就是在以上的程式碼中,這個 FONT 是在此 Create 的,在此模組/程式結束時,會自動 delete 嗎? ---------------- 我認為在程式中Font並未Create過而是繼承Edit1.Font, Step1:建立一個圖形化物件,此物件繼承了Edit1.Font.Handle Step2:更該此圖形化物件內值 Step3:將圖形化物件交還給一個已經存在的Font.Handle 況且CreateFontIndirect中Indirect是非直接的Create,所以實際上並未Create過
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-06-03 11:38:59 IP:211.22.xxx.xxx 未訂閱
謝謝各位兄台的解惑, 小弟收穫不少! :)
系統時間:2024-03-29 20:00:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!