怎樣使窗體大小改變時,其上的控件也按比例改變? |
尚未結案
|
linken
一般會員 發表:23 回覆:37 積分:22 註冊:2004-11-24 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
用 ScaleBy
如:
.... private LastW,LastH :Integer; ReSizeLock : Boolean; public ..... procedure TForm1.FormCreate(Sender: TObject); begin ReSizeLock := False; LastW := Width; LastH := Height; end; procedure TForm1.FormResize(Sender: TObject); begin if ReSizeLock then Exit; if Width<>LastW then Try ReSizeLock := True; Scaled:=True; SetBounds(Left,Top ,(Width*LastW) Div LastW ,(Height*LastH) Div LastH); ScaleBy(Width,LastW); LastW := Width; LastH := Height; Finally ReSizeLock := False; end; end;PS. 由於沒有時間再做修正了。可能有一些小問題。 僅提供參考一下原理 發表人 - wameng 於 2005/05/20 14:47:12 |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
procedure ScaleBy(M, D: Integer);
每執行一次, 元件縮小為原來 M/D
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin // 每按一次, 元件縮小為原來 3/4 ScaleBy(3,4); end; end.********************* 如果您滿意答案,請結案 *********************
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
linken
一般會員 發表:23 回覆:37 積分:22 註冊:2004-11-24 發送簡訊給我 |
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
ScaleBy(600, 768);
或
ScaleBy(800, 1024); 因為 600/768 = 800 / 1024 = 0.78125 偵測解析度可用
X := Screen.Width
Y := Screen.Height 例如你的 form 是設計為 800 x 600, 切換到 任意解析度自動調整大小, 可用下面程式碼
inplementation const ScreenWidth: LongInt = 800; ScreenHeight: LongInt = 600; {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin scaled := true; if (screen.width <> ScreenWidth) then begin height := longint(height) * longint(screen.height) div ScreenHeight; width := longint(width) * longint(screen.width) div ScreenWidth; scaleBy(screen.width, ScreenWidth); end; end;********************* 如果您滿意答案,請結案 ********************* 發表人 - pcboy2 於 2005/05/23 01:16:26
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
linken
一般會員 發表:23 回覆:37 積分:22 註冊:2004-11-24 發送簡訊給我 |
pcboy2
再次謝謝你給我的回答.根據你的原代碼
implementation
const
ScreenWidth: LongInt = 800;
ScreenHeight: LongInt = 600; procedure Tfrmmain.FormCreate(Sender: TObject);
begin
scaled := true;
if (screen.width <> ScreenWidth) then
begin
height := longint(height) * longint(screen.height divScreenHeight;
width := longint(width) * longint(screen.width) div ScreenWidth;
scaleBy(screen.width, ScreenWidth);
end;
end; 這樣做了一個例子..雖然能達到各控件大小的變化,但里面字的大小不會跟著變的.例如 DBGrid1 控件.它的網格不會變同時網格標題的字也不會變...
不知能否實現像Window操作系統那樣什麼都跟著變呢??? ken
------
ken |
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
事實上,這樣的結果是可以預期的。 要不然為何有些遊戲,進入遊戲就會馬上切換目前解析度至遊戲自訂解析度。
你也可以這樣做,只不過在切換視窗時,需還原為原先的解析度。 然而善用Align 繼使在改變解析度後,不至於畫面亂了。
或者提供幾種解析度的判斷及程式畫面切換。 另外Window 作業系統的改變解析度,是利用硬體及驅動做到的。
或者可以參考http://vcl.vclxx.org/DELPHI/D32FREE/AUTOSIZE.ZIP
也是利用ScaleBy 但有加入字型大小的設定。
但我覺得這些效果都不盡理想。 參考 ~~~~~~~~~~~
難得聰明,常常糊塗。
~~~~~~~~~~~
|
linken
一般會員 發表:23 回覆:37 積分:22 註冊:2004-11-24 發送簡訊給我 |
|
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
|
linken
一般會員 發表:23 回覆:37 積分:22 註冊:2004-11-24 發送簡訊給我 |
|
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
|
linken
一般會員 發表:23 回覆:37 積分:22 註冊:2004-11-24 發送簡訊給我 |
pceyes
謝謝你給我的提示.我是安裝了VCL,里面有ResizerPanel1,NoBDEResizerPanel1,BitBtn1,
SpeedButton1四個控件.我拉這四個控件到窗體
里面然之后運行,再拉窗體大小,可是都是不會變
同普通Delphi自帶的沒區別,難道還要寫代碼的?
麻煩你教教我可以嗎??
是了,其實我也是用Delphi5.0的,不知哪里
還有ResizerPanel v2.08下載呢???不過最主要
的還是教會我怎麼用,有勞.在此謝過.... ken
------
ken |
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
以下是我之前用d5寫的程式,我重新用d7編譯過
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=71850 NoBDEResizerPanel1 <- 我一般都用這個
ResizerPanel1 <- 這給資料庫(database)感知元件用的 把它當做一般panel用就好了,完全不用寫程序 再把你要的元件放上去就好了. 再試一下吧! good luck! 於之前的版本,你可以到delphi 32 深度歷險 或 torry's delphi page去找 努力會更接近成功
------
努力會更接近成功 |
linken
一般會員 發表:23 回覆:37 積分:22 註冊:2004-11-24 發送簡訊給我 |
|
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
|
linken
一般會員 發表:23 回覆:37 積分:22 註冊:2004-11-24 發送簡訊給我 |
Dear pceyes:
真的非常感謝你的幫助,真的行了喲!!
真的太高興了,沒想到你時時刻刻都在網
上的喲!!!最讓我佩服你的是:你還是一個
業餘人員.以後請pceyes兄多多指教喲!!
真的很高興能與你成為朋友.
不過沒想到的是你離我是那麼的遠.我
還以為你是大陸這邊的喲!!!哈哈說到臺灣
與中國不知老兄是怎麼認為的呢??
是了,現在你給我那麼好用的控件現在
卻沒有ResizerPanel v2.08,我怎麼安裝到
Delph5.0那里呢??不知pceyes兄可不可E-Mail
給我(哈哈,我知道你有的)或是給我具體網站讓
我下載呢!!在此再行謝過!!!
雖然我倆不是同齡人,但願可以成為知識的
好朋友.... ken
------
ken |
linken
一般會員 發表:23 回覆:37 積分:22 註冊:2004-11-24 發送簡訊給我 |
|
linken
一般會員 發表:23 回覆:37 積分:22 註冊:2004-11-24 發送簡訊給我 |
pceyes 兄:
謝謝你給我發這元件,可是下載解壓後
不安裝不上的,我是按照它的要求這樣做的.
首先把解壓後的文件拷貝到 C:\BorlandDelphi5.0\Lib .中然後打開Delphi5.0 ,Select
Component->Install Component ,Select Lib->NoBDERP.pas
當走到這步的時候就出錯了,錯誤信息是:
[Error] NoBDERP.pas(279): Undeclared identifier: 'TWarningListForm'
[Error] NoBDERP.pas(286): Undeclared identifier: 'TResizerPanelEditor'
這是沒有定義這些名稱的意思,應怎麼解決呢??
又有勞pceyes 兄了...... ken
------
ken |
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
為了你, 我又裝了一次d5, 移除d3和d7
你的程序確實沒錯, readme.htm 是和你的安裝方式一樣
但它可能錯了,
我直接用resizer.pas安裝, 也不管它下方的訊息, 反正它裝起來了
編譯也過了,
對了,我甚至沒有做它copy至c:\program files\boland\delphi5\lib的動作. 真的很奇怪,為什麼我常在d3-d7的版本安裝<->反安裝,好像瘋子呀!
=因為有些元件只有d3有,有的只能在d7編譯,又不太會改元件,(懶得學怎樣改)反正安裝移除比較簡單,不過d5比較討厭,不能從硬碟按裝,真想寫一個自動安裝機器人程式,不然確實沒有一勞永逸的好法子. 努力會更接近成功
------
努力會更接近成功 |
linken
一般會員 發表:23 回覆:37 積分:22 註冊:2004-11-24 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |