2017-08-16 124 views
6

中通過組合兩個控件(TEdit和TTrackBar)創建一個新組件我正在爲Windows開發一個Delphi 10.1 VCL應用程序。在Delphi VCL

對於整數或浮點數輸入我需要一個數字輸入字段,它與滑塊連接。當用戶更改輸入字段中的數字時,滑塊位置會相應更改。當用戶更改滑塊位置時,數字字段中的數字會更新。

我可以通過使用TEdit和TTrackBar來解決此問題,並在其OnChange事件處理程序中添加必要的更新功能。

enter image description here

的問題是,我需要很多不同的形式,例如輸入。因此,我想創建一個新組件,它將兩個控件TEdit和TTrackBar組合在一個組件中。

  1. 創建新組件是多次使用這種滑塊輸入的最佳策略嗎?

  2. 創建這樣一個新組件的最佳方法是什麼?

+4

我會從'TCustomControl'派生和'SetSubComponent'這些子控件。剩下的就是將這些子控件作爲屬性發布,或者發佈一些基本的屬性集(例如這些子控件的值和位置)。另一種方法是使用框架,但是有人將內部控件移動的風險。 – Victoria

+0

@維多利亞你能解釋一下你的意思嗎?「但是有人冒着內部控制的風險」?用戶如何移動控件? – user3384674

+1

當然:)如果你將使用幀('TFrame'),你或其他人將能夠分別在每一幀中移動容器內的控件(據我所知)。因此,他們可以打破原有的控制佈局(最終可能需要 - 取決於您的需求)。如果你創建一個複合控件,這是不可能發生的。 – Victoria

回答

7

是一個新的組件的多個 使用這樣的滑動塊輸入的最佳策略的創造?

不一定總是如此。 (至少按我的標準)。

創建這種新組件的最佳方法是什麼?

我知道三種方法來解決你的問題。

路號1:

創建通過使用自己動態創建TeditTtrackbar子在Tgroupbox後續組件的新組件嚮導中的組件。

以下是我將如何做到這一點。

unit Combindedittrack; 

interface 

uses 
    System.SysUtils, System.Classes, Vcl.Controls, Vcl.comctrls ,Vcl.StdCtrls; 

type 
    TCombindedittrack = class(Tgroupbox) 
    private 
    { Private declarations } 
    Fedit:tedit; 
    Ftrackbar: TTrackBar; 
    procedure editonchangeproc(Sender: TObject); 
    procedure trackbaroOnchange(Sender: TObject); 
    protected 
    { Protected declarations } 

    public 
    { Public declarations } 
    constructor Create(owner:tcomponent); override; 
    destructor Destroy; override; 
    published 
    { Published declarations } 
    end; 

procedure Register; 

implementation 

procedure Register; 
begin 
    RegisterComponents('Samples', [TCombindedittrack]); 
end; 

constructor TCombindedittrack.Create(owner:tcomponent); 
begin 
inherited Create(owner); 
SetBounds(0, 0, 250, 50); 
Fedit:=tedit.Create(self); 
with Fedit do 
    begin 
    text := ''; //<-- you control the appearence here 
    top := 10; 
    left := 10; 
    height := 27; 
    width := 50; 
    parent:=self; 
    Onchange:=editonchangeproc; // your Onchange event handler for the Tedit 
    end; 

Ftrackbar:=ttrackbar.Create(self); 
with Ftrackbar do 
    begin 
    top := 10; //<-- you control the appearence here 
    left := 60; 
    height := 30; 
    width := 50; 
    parent:=self; 
    Onchange:=trackbaronchangeproc; // your Onchange event handler for the Ttrackbar 
    end; 
end; 

destructor TCombindedittrack.Destroy; 
begin 
Ftrackbar.Free; 
Fedit.Free; 
inherited; 
end; 

procedure TCombindedittrack.trackbaroOnchange(Sender: TObject); 
begin 
// <-- track bar onchange handling here. 
end; 

procedure TCombindedittrack.editonchangeproc(Sender: TObject); 
begin 
// <-- edit onchange handling here. 
end; 

end. 

路號2:

使用框架是這樣的(我在德爾福西雅圖10)。

1)文件 - >新建 - >其他 - >(在delphi文件上搜索框架)。

2)現在添加編輯和跟蹤欄並設置他們的Onchange事件。

3)保存設備。

4)在工具面板(標準組件部分)上單擊框架組件。

5)選擇您剛創建的框架。

每次使用時都會有一個框架副本。

路號3:

使用組件模板像這樣(再次聲明,我對德爾福西雅圖10)

1)選擇您已經創建並修改teditttrackbar

2)在工具欄的「組件」上單擊「創建組件模板」。

3)命名您的模板,然後按確定。

4)選擇模板調色板,然後選擇您的模板。

現在請注意,即使您的代碼(事件)也添加到您的項目中。

最後

隨着我對德爾福的水平,我真的無法給你一個明確的答案,這是最好的方式,但無論如何,我已經共享的所有我所知道的,可以幫助IDE您。


編輯:由於很多評論都堅持認爲答案應該說明這是做到這一點的最好辦法。這是基於以下的最佳方式。

,讓我們把一些關鍵點應考慮選擇

易於修改的綜合控制(S)的,如果你願意的話(我的經驗,你會)時。

2.完成此任務所需的時間(這意味着您需要花費很長時間才能完成完成任務且調試和編碼最少)。

3.通用源代碼可讀性。

4.對您項目的未來有用。

現在讓我們開始批評基於這些標準的三種方法。

路號1:

C1(標準編號1):只需修改組件和每個複製品/使用的源實現將具有相同的效果和性能。然而,這不是路號3

C2的情況:這取決於你的組件的寫作知識,但此組件,我花了5分鐘來創建它,我只是在Delphi初學者。對於調試,如果出了問題,問題是在組件實現比你只需要固定一次(見C1)

C3:他們是在你的形式(S)爲您的組件的源代碼的實現只是將其添加到您的表單中,並且隱藏每件事物(例如,添加一個tedit,並在您的表單源中查看實現)。

C4:您正在創建一個組件,畢竟這將爲您創建自己的一套組件(如Flatstyle或Indy開源組件)打開大門。所以下一次你需要這樣的東西時,你只需將它放在你的表單設計器中,就完成了。

路號2:

C1:它像路號1,因爲你正在創建一個組成部分,但在視覺上這一次。修改源框架將會改變副本的效果和屬性,您也可以向副本添加額外的處理。

副本的onChange事件的事件處理程序是這樣的

procedure TForm1.Frame2Edit1Change(Sender: TObject); 
begin 
    Frame2.Edit1Change(Sender); //<-- this is the original onchange event you setup at the beginning 
    //<-- you can extra handling here if you want one of the replicas to behave differently than the original 
end; 

C2:同時,也許比路數快1

C3:在所有,它具有同樣出來的方式編號1.

C4:不像方法1號,你不能使用項目A中創建的框架項目B.因此,您的編碼和調試將保留在項目A中。

方式3:組件模板。

C1:您並未創建一個組件,您正在創建您在上一個項目中完成的確切步驟的repleca /宏。改變一個人不會改變他們分開的其他人。

C2:同時,也許比路號1

C3更快:每次模板添加到您的表格時,該事件的代碼將被添加(如果沒有一個很好的觀點是一個長的Onchange代碼)。

C4:您可以在項目中的項目B.創建的模板但是你在項目中寫道:將在項目B(見C1)甚至沒有B工程存在的變量(引用考慮到每次使用模板之間的時間段,這可能很難調試和誤導。

結論:每個呈現方式會消耗時間編寫和調試,所有的人都會做任務,如何過爲簡單起見,用最小的風險之路號碼1的複用在這裏是安全的選擇因爲它會讓你有機會更新和安全升級。也調試更快。

關於方式1的好處是,過了一段時間後,您將忘記實施以及內部工作情況。唯一應該記住的是組件的用途,因爲它將成爲你使用的各種組件之一(你不知道如何實現Tedit,你不需要,但是你可以在每一個單獨的組件中使用它你創建的項目)。

根據給定的標準方式編號1是最好的

+0

問題問哪個最好。如果你必須回答,當然你需要陳述和證明哪一個最好。 –

+0

如果問題是「哪個最好」,那是不是意味着它是「主要基於意見」,因此不允許在SO上? – dummzeuch

+0

@DavidHeffernan我編輯了我的答案。 –

4

也許使用包含兩個控件的容器控件是一個更簡單的選擇。我爲此使用ccpack。

https://sourceforge.net/projects/ccpack/

自定義容器包(CCPack)是一個集成的工具和部件微型 庫以產生和維持複合控件(或簡稱爲「複合材料」) 和其它容器(窗體,數據模塊和幀)。 構建複合組件的過程看起來像ActiveForm和Frame的創建,但 的結果是本地VCL組件。您可以像平常一樣創建新的複合材料 。

+2

CCPack是一個偉大的Delphi工具,大大低估了! –

0

您可以創建一個Frame,然後將該Frame註冊爲一個組件。最終結果與在構造函數中創建子組件的代碼組件(Nasreddine的編號爲1的選項)非常相似。但是,此方法允許您直觀地設計組件並使用對象檢查器來創建事件處理程序。

這是一個堆棧溢出問題,顯示如何註冊框架: How to Improve the Use of Delphi Frames

相關問題