各位高手 前輩 同行 新年快樂!!!
小弟想實作這么個想法, 在delphi里的設計時候, 遇到要放置多個相同控制元件, 其屬性設定本 就基本一樣, 不同的只是比如名字, 比如系結欄位不同而已, 如何一次實作這些控制元件的放置, 而不用一個一個的添加, 一個一個的修改屬性
我現在想到是分別在pas和dfm的代碼中添加相應代碼, 還有更先進的方法嗎?
uj5u.com熱心網友回復:
復制粘貼會不?uj5u.com熱心網友回復:
1,一般通過復制和粘貼。2,可以事前做一個視窗,存在若干個控制元件。用時打開這個視窗的pas檔案,從中通過滑鼠選擇數個控制元件,復制后,粘貼到你的視窗。
uj5u.com熱心網友回復:
復制粘貼完了 就不用改名字了? 就不用設屬性了?? 就直接可以用了???uj5u.com熱心網友回復:
不想復制粘貼,那就在代碼里 動態生成控制元件好了,寫個回圈直接添加uj5u.com熱心網友回復:
這種?
這個是我平臺的功能,一般都是用來修改備用欄位的屬性或創建備用欄位的
DELPHI應該有這種類似的第三方吧
uj5u.com熱心網友回復:
你好,這個對我有用, 請問這個輔助工具的名字呢?
我只用過cnpack,里面好像沒有你這功能
uj5u.com熱心網友回復:
并不是動態生成出來就完事了, 還有不同屬性設定, 事件呢
uj5u.com熱心網友回復:
偷懶是解決不了問題一款軟體就像程式員的孩子一樣
一把屎一把尿,慢慢碼出來
心急吃不了熱豆腐,慢慢來吧
uj5u.com熱心網友回復:
下面再發一下不知所云的東東:不好意思是別人寫的東西!不知有用否!
至于檔案的保存,自定義一個檔案格式,如ini等!
發信人: zhjjs (hhh), 信區: Visual
標 題: Delphi動態DFM檔案應用(一)
發信站: 華中地區網路中心 (Fri Dec 13 22:33:45 1996)
1. 動態DFM檔案概述
動態DFM檔案是相對于靜態DFM檔案而言。所謂靜態DFM檔案是指在Delphi開發環境
中設計的表單檔案。表單的設計程序就是程式的編制程序。因此,動態DFM檔案就是指
在程式運行程序生成或存取的DFM檔案。
動態DFM檔案的創建和使用分別如下兩種情況:
● 在程式運行程序中,由Create方法動態生成表單或部件,然后動態生成其它部
件插入其中生成DFM檔案
● 在Delphi開發環境中,設計生成DFM檔案,然后用DFM 檔案存取函式,或者用Str
eam物件和Filer物件的方法,將DFM檔案讀入記憶體,進行處理,最后又存入磁盤中
由Delphi的表單設計的常規方法生成的DFM檔案在程式運行一開始就規定了部件的
結構。因為在表單設計程序中,表單中的每個部件都在程式的物件宣告中定義了部件變
量。這種固定的結構雖然能方便應用,但以犧牲靈活性為代價。
在Delphi應用程式中有時需要在運行程序中創建控制,然后將該控制插入另一個部
件中。例如:
procedure TForm1.Button1Click(Sender: Tobject);
var
Ctrl: TControl
begin
Ctrl := TEdit.Create(Self);
Ctrl.Top := 100;
Ctrl.Left := 100;
Ctrl.Width := 150;
Ctrl.Height := 20;
InsertControl(Ctrl);
end;
動態插入控制的優點是可以在任何時刻、任意位置插入任意數量的任何型別的控
制。因為應用程式需求在很多情況下是在程式運行中才知道的,所以動態插入控制就顯
得很重要。而且在很多情況下,需要保存這些界面元素,留待程式再次呼叫。例如應用
程式界面的定制、系統狀態的保存、對話框的保存等。這時生成動態DFM檔案是最佳選
擇。
動態插入控制的不足之處是在插入控制前,無法直觀地看到控制的大小、風格、位
置等,也就是動態插入控制的程序是非可視化的。但可以借助于靜態DFM檔案的可視化
設計。這就是生成和使用動態DFM檔案的第二種方法。也就是在應用程式運行前,在Delp
hi開發環境中,使用可視化開發工具設計所需視窗或部件的樣式,以DFM檔案保存。然
后在應用程式運行程序中,將DFM檔案讀入記憶體。Delphi的Stream物件和Filer物件在讀
取DFM檔案時,會根據DFM檔案的內容自動創建部件及其擁有的所有部件。
在使用動態DFM檔案時有兩點需要注意。
● 每一個動態插入的控制或部件必須在程式中呼叫RegisterClass進行注冊
● 讀入DFM檔案自動創建部件后,如果呼叫了InsertControl方法, 則在關閉視窗
時要呼叫RemoveControl方法移去該控制,否則會產生例外事件
2. 動態DFM檔案應用之一:超媒體系統的卡片設計
Delphi多種型別的可視部件,如文本部件、編輯部件、圖形影像部件、資料庫部
件、媒體媒放部件和OLE部件等,每一種部件在螢屏中占據一定的區域,具有相當豐富的
表現能力,可以作為卡片中的一種媒體,因此可以利用這些可視部件進行超媒體系統的
卡片設計。
超媒體卡片設計要求卡片中的媒體數目和媒體種類是不受限制的,而且必須能夠修
改和存取卡片,因此,采用動態DFM檔案是比較合適的。而且如果利用Stream物件,將卡
片存盤在資料庫BLOB欄位中,就為把超文本與關系資料庫技術結合起來創造了貧訓。
下面是超媒體卡片設計子系統中的部分源程式,它演示了如何創建物件、插入物件
和存取動態DFM檔案。
⑴ 在應用程式中注冊物件
procedure TMainForm.FormCreate(Sender: TObject);
begin
RegisterClass(TLabel);
RegisterClass(TEdit);
RegisterClass(TMemo);
RegisterClass(TButton);
RegisterClass(TPanel);
RegisterClass(TPanelP);
RegisterClass(TBitBtn);
…
end;
⑵ 創建和插入物件
procedure TMDIChild.FormClick(Sender: TObject);
var
Ctrl : TControl;
Point: TPoint;
begin
GetCursorPos(Point);
Point := BackGround.ScreenToClient(Point);
case CurToolIndex of
1 : begin
Ctrl := TLabel.Create(self);
TLabel(Ctrl).AutoSize := False;
TLabel(ctrl).Caption := 'Label'+S;
TLabel(ctrl).Name := 'Label 1';
TLabel(ctrl).Top := Point.Y;
TLabel(ctrl).Left := Point.X;
TLabel(Ctrl).Height := Round(100*Res/1000/Ratio);
TLabel(Ctrl).Width := Round(600*Res/1000/Ratio);
TLabel(Ctrl).Color := clWhite;
TLabel(Ctrl).Font.Color := clBlack;
TLabel(Ctrl).Font.Name := 'Roman';
TLabel(Ctrl).Font.Height := -TLabel(Ctrl).Height;
TLabel(Ctrl).Font.Pitch := fpFixed;
TLabel(Ctrl).Enabled := False;
TLabel(Ctrl).OnClick := LabelClick;
TLabel(Ctrl).OnMouseMove := ReportPos;
BackGround.InsertControl(Ctrl);
CurTool.Down := False;
CurTool := nil;
…
end;
2: begin
Ctrl := TEdit.Create(self);
TEdit(ctrl).AutoSize := True;
TEdit(ctrl).Top := Point.Y;
TEdit(ctrl).Left := Point.X;
TEdit(Ctrl).Height := 20;
BackGround.InsertControl(Ctrl);
…
end;
3:
…
end;
end;
⑵ 存取動態DFM檔案
procedure TMainForm.FileOpen(Sender: TObject);
begin
if OpenDialog.Execute then
begin
DesignWin := TMDIChild.Create(Application);
ReadComponentResFile(OpenDialog.FileName, DesignWin);
DesignWin.Init;
FileName := OpenDialog.FileName;
DesignWin.Caption := FFileName;
end;
end;
DesignWin是在TMainForm中定義的TMDIChild型別的表單部件,是卡片設計平臺;FFi
leName是私有變數,用來保存當前編輯的卡片檔案名。DesignWin的Init方法實作如下:
procedure TMDIChild.Init;
var
I: Integer;
Ctrl: TControl;
begin
BackGround.BringToFront;
with BackGround do
for I:= 0 to ControlCount - 1 do
if Controls[I].Name <> ''then
ObjectIns.ObjectList.Items.AddObject(Controls[I].Name, Controls
[I]);
end;
BackGround是TPanel型別的部件,所有的動態創建物件都插入到BackGround中,所
以,后面呼叫BackGround.InsertControl(Ctrl);ObjectIns是個仿Delphi 的媒體屬性
編輯器。
動態DFM檔案的存盤程序是這樣的:
procedure TMainForm.FileSave(Sender: TObject);
begin
if DesignWin.CurControl <> nil then
DesignWin.CurControl.Enabled := True;
WriteComponentResFile(FFilename, DesignWin);
DesignWin.Caption := FileName;
end;
end;
因為在DesignWin的Init方法中呼叫了InsertControl方法,所以在關閉DesignWin窗
口時要相應地呼叫RemoveControl,否則在關閉DesignWin視窗時會產生記憶體錯誤。
procedure TMDIChild.FormCloseQuery(Sender: TObject; var CanClose: Boole
an);
var
I: Integer;
Ctrl: TControl;
Removed: Boolean;
begin
if Modified = True then
if MessageDlg('Close the form?', mtConfirmation,
[mbOk, mbCancel], 0) = mrCancel then
CanClose := False;
if CanClose = True then
begin
repeat
removed := False;
I := 0;
repeat
if BackGround.Controls[I].Name <> '' then
begin
BackGround.RemoveControl(BackGround.Controls[I]);
Removed := True;
end;
I := I + 1
until (I >= BackGround.ControlCount) or (Removed = True);
until (Removed = False);
SendMessage(ObjectIns.Handle, WM_MDICHILDCLOSED, 0, 0);
end;
end;
3. 動態DFM檔案應用之二:超媒體系統腳本語言設計
超媒體腳本語言設計是超媒體系統設計的重要內容。腳本語言必須能夠表達卡片中
的多種媒體物件,必須是可編程,可理解的,必須是可執行的,應該可以由腳本語言生
成超媒體系統中的卡片和鏈。
DFM檔案可以看作是超媒體系統的卡片,DFM腳本能夠表達DFM檔案中的多種控制,也
就是說能夠表達卡片中的多種媒體物件,再加上DFM腳本的物件式表達,可編輯性,可轉
換為DFM檔案,因此用作超媒體系統腳本語言較好的形式。
ObjectBinaryToText和ObjectTextToBinary程序提供了在部件和DFM腳本之間相互轉
化的功能,ObjectResourceToText和ObjectTextToResoure程序提供了DFM檔案和DFM腳本
之間相互轉化的功能。這樣就可以在應用程式中自如實作超媒體卡片和超媒體腳本語言
相互轉化。
下面是卡片和腳本語言相互轉化的程式:
procedure TMDIChild.CardToScript;
var
In, Out: TStream;
begin
In := TMemoryStream.Create;
Out := TMemoryStream.Create;
try
In.WriteComponentRes(Self.ClassName, Self);
ObjectResourceToText(In, out);
ScriptForm.ScriptEdit.Lines.LoadFromStream(Out);
finally
In.Free;
Out.Free;
end;
end;
ScriptEdit是個文本編輯器,它的Lines屬性是TStrings型別的物件。
procedure TScriptForm.ScriptToCard;
var
In, Out: TStream;
begin
In := TMemoryStream.Create;
Out := TMemoryStream.Create;
try
ScriptForm.ScriptEdit.Lines.SaveToFromStream(In);
ObjectTextToResource(In, out);
In.ReadComponentRes(DesignWin);
finally
In.Free;
Out.Free;
end;
end;
這兩段程式是對整個卡片,即表單級,進行轉換的。ObjectBinaryToText和ObjectTe
xtToBinary程序可以細化到部件級的轉換。因此超媒體腳本語言的編輯可以細化到媒體
物件級。
uj5u.com熱心網友回復:
弄好一個,復制粘貼uj5u.com熱心網友回復:
感謝以上2位發回復,但5樓給的貼圖里的效果, 就是我想要的, 就是不知道這個輔助軟體叫什么名字? 搜不到, 知道的前輩能告訴下這個輔助的名字。 謝謝
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/72946.html
標籤:VCL組件開發及應用
下一篇:求指點
