2017-08-16 65 views
6

Pracuję nad aplikacją VCL Delphi 10.1 dla systemu Windows.Tworzenie nowego komponentu przez połączenie dwóch kontrolek (TEdit i TTrackBar) w Delphi VCL

Do wprowadzania liczb całkowitych lub zmiennoprzecinkowych potrzebne jest pole wprowadzania liczb połączone z suwakiem. Gdy użytkownik zmieni numer w polu wejściowym, położenie suwaka zmienia się odpowiednio. Gdy użytkownik zmieni położenie suwaka, numer w polu numeru zostanie zaktualizowany.

Mogę rozwiązać ten problem za pomocą TEdit i TTrackBar i dodać niezbędne funkcje aktualizacji w ich programach obsługi zdarzeń OnChange.

enter image description here

Problem polega na tym, że trzeba wiele takich wejść na różnych formach. Dlatego chciałbym stworzyć nowy komponent, który łączy w sobie dwie kontrolki TEdit i TTrackBar w jednym komponencie.

  1. Czy stworzenie nowego komponentu jest najlepszą strategią wielokrotnego wykorzystania takiego wejścia suwaka?

  2. Jaki jest najlepszy sposób na stworzenie takiego nowego komponentu?

+4

chciałbym czerpać z '' SetSubComponent' TCustomControl' i dla tych subcontrols. Reszta będzie publikować te kontrole podrzędne jako właściwości lub publikując pewien podstawowy zestaw właściwości (np. Dla wartości i pozycji tych kontrolek). Innym sposobem jest użycie ramek, ale istnieje ryzyko, że ktoś przesunie elementy sterujące w środku. – Victoria

+0

@Victoria Czy mógłbyś wyjaśnić, co masz na myśli przez "ale istnieje ryzyko, że ktoś przenosi kontrolę wewnątrz"? W jaki sposób użytkownik może przenosić elementy sterujące? – user3384674

+1

Oczywiście :) Jeśli będziesz używać ramki ('TFrame'), ty lub ktoś inny będzie mógł przenosić elementy sterujące w kontenerze na każdej ramce osobno (o ile pamiętam). Mogą więc złamać pierwotny układ sterowania (w końcu może być pożądany - w zależności od potrzeb). To się nie stanie, jeśli utworzysz kontrolę złożoną. – Victoria

Odpowiedz

7

jest stworzenie nowego komponentu najlepszą strategią dla wielu zastosowania takiego wejścia suwak?

Niekoniecznie przez cały czas. (przynajmniej według moich standardów).

Jaki jest najlepszy sposób na stworzenie takiego nowego komponentu?

Znam trzy sposoby rozwiązania problemu.

liczba Way 1:

utworzyć komponent przy użyciu nowego kreatora komponentu gdzie dynamicznie utworzyć i Ttrackbar elementy podrzędne w A Tgroupbox potomka Tedit.

Oto, jak to zrobić.

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. 

liczba Way 2:

używają ramek tak (jestem na Delphi 10 Seattle).

1) Plik -> Nowy -> Inny -> (wyszukiwanie ramek w plikach delphi).

2) Teraz dodaj edycję i pasek śledzenia i ustaw ich zdarzenia Onchange.

3) Zapisz urządzenie.

4) kliknij paletę narzędzi (standardowy komponent) na komponent ramy.

5) wybierz nowo utworzoną ramkę.

Będziesz mieć replikę ramki za każdym razem, gdy jej użyjesz.

liczba Way 3:

Wykorzystanie składnika szablon jak to (znowu jestem na delphi 10 Seattle)

1) wybrać swoje już tworzone i modyfikowane tedit i ttrackbar.

2) Na "komponencie" paska narzędzi kliknij "utwórz szablon komponentu".

3) Nazwij szablon i naciśnij OK.

4) Wybierz paletę Szablon, a następnie swój szablon.

Teraz zauważ, że nawet twój kod (wydarzenia) są dodawane do twojego projektu.

Wreszcie

Z poziomu mam na Delphi i IDE Jestem naprawdę w stanie dać jasną odpowiedź co jest najlepszym sposobem, ale mimo to mają wspólne wszystkim, co wiem, że może pomóc ty.


edit: Ponieważ wiele komentarzy są podkreślając, że odpowiedź powinna stwierdzić, co jest najlepszym sposobem, aby to zrobić. jest to najlepszy sposób na podstawie poniższych.

postawmy niektóre z punktu kluczowego, które powinny być uwzględnione przy wyborze

1. Łatwość modyfikacji kontrolę łączone (y), jeśli sobie tego życzą (według mojego doświadczenia, będzie).

2. czas potrzebny do wykonania tego zadania (to znaczy czas zajmie Ci w pełni wykonać zadanie z minimalną debugowania i kodowanie).

3. ogólna czytelność kodu źródłowego.

4. Użyteczność dla przyszłości Twoich projektów.

Teraz pozwala rozpocząć krytykowanie trzech metod w oparciu o te kryteria.

liczba Way 1:

C1 (kryteria numer 1): Wystarczy zmodyfikować realizację źródłem komponentu i każdego replik/użytkowania będą miały te same efekty i właściwości. Jednak nie jest tak w przypadku sposobu nr 3.

C2: To zależy od twojej wiedzy na temat komponowania, ale dla tego komponentu zajęło mi to 5 minut, aby go stworzyć i jestem dopiero początkującym użytkownikiem w delphi.Do debugowania, jeśli coś poszło nie tak i problem jest w implementacji komponentu, niż potrzebujesz tylko raz naprawić (zobacz C1)

to nie jest implementacja w Twoim kodzie źródłowym kodu komponentu dodaj go do formularza i wszystko jest ukryte (na przykład dodaj tedit i przejdź do implementacji w źródłach formularzy).

C4: Tworzycie komponent po tym wszystkim będzie otwierać drzwi, aby stworzyć swój własny zestaw komponentów, takich jak komponenty open source Flatstyle lub Indy. więc następnym razem potrzebujesz czegoś takiego, po prostu upuść to w swoim projektancie formularzy i gotowe.

liczba Way 2: klatek

C1: Jest to liczba jak droga 1, ponieważ podczas tworzenia komponentu ale jest wizualnie i tym razem. modyfikowanie ramki źródłowej zmieni efekty i właściwości replik, dodatkowo możesz dodać dodatkową obsługę do replik.

obsługi zdarzeń imprezy Replika za onChange jest jak ten

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: samym czasie i być może szybciej niż liczba stronę 1.

C3: ponad wszystko, to ma to samo jest dostępne pod numerem 1.

C4: w przeciwieństwie do sposobu numer 1 nie można używać ramek utworzonych w projekcie A w projekt B. Twoje kodowanie i debugowanie pozostaną w projekcie A.

Szablon numeru drogi 3:.

C1: Nie tworzysz komponentu, dla którego tworzysz replikę/makro z dokładnymi czynnościami wykonanymi w ostatnim projekcie. zmiana jednego nie zmieni pozostałych, które są rozdzielone.

C2: za każdym razem dodać szablon do formularza kod zdarzenia zostaną dodane (nie jest to dobry widok jeśli jest to: samym czasie i być może szybciej niż drogi numer 1.

C3 długi kod Onchange).

C4: Można użyć szablonów utworzonych w projekcie A w projekcie B. Jednak to, co napisałeś w rzutować będzie w projekcie B (patrz c1) nawet odniesienia do zmiennych, które nie istnieją w projekcie B (może to być trudne do debugowania i wprowadzania w błąd, biorąc pod uwagę okres czasu między każdym użyciem szablonu).

Wniosek: każdy ze sposobów przedstawionych będzie zużywają czas na kod i debugowania i wszystkie z nich będzie wykonać zadanie, jaki kiedykolwiek do uproszczenia i ponownego użycia przy minimalnym zagrożeniu numerem sposób 1 jest bezpieczny wybór tutaj ponieważ da ci to możliwość aktualizacji i aktualizacji bezpiecznie. również szybsze debugowanie.

Dobrą rzeczą również na drodze numer 1 jest to, że po pewnym czasie zapomnisz o wdrożeniu i jak działa wewnętrznie. Jedyną rzeczą, o której należy pamiętać, jest cel tego składnika, ponieważ stanie się on jednym z wielu używanych składników (nie wiesz, jak zaimplementowano Tedit i nie musisz tego robić, ale używasz go w każdym pojedynczym projekt, który tworzysz).

na podstawie podanych kryteriów Numer drogi 1 jest najlepszy.

+0

Pytanie, które pytanie jest najlepsze. Jeśli musisz odpowiedzieć, z pewnością musisz podać i uzasadnić, który jest najlepszy. –

+0

Jeśli pytanie brzmi "co jest najlepsze", czy nie oznacza to, że jest ono "oparte głównie na opiniach" i dlatego nie jest dozwolone w języku SO? – dummzeuch

+0

@DavidHeffernan Edytowałem moją odpowiedź na to. –

4

Być może użycie kontrolki kontenera, która zawiera obie kontrolki, jest prostszą alternatywą. Używam ccpack do tego.

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

klienta Pojemniki paczka (CCPack) jest zintegrowany narzędzie i składnik mini biblioteki w celu wytworzenia i utrzymania kontroli złożonych (lub po prostu „kompozyty”) i innych pojemników (formy, moduły danych i ramki). Proces kompilowania komponentów budynku wygląda tak, jak formacja ActiveForm i ramka, ale wynikiem jest natywny komponent VCL. Możesz tworzyć nowe kompozyty po prostu jako zwykłe formularze.

+2

CCPack to świetne narzędzie Delphi, które jest bardzo niedoceniane! –

0

Możesz utworzyć ramkę, a następnie zarejestrować tę ramkę jako komponent. Wynik końcowy jest bardzo podobny do tworzenia komponentu tylko kodu, w którym komponenty podrzędne są tworzone w konstruktorze (opcja nrred Nasheddine'a). Ta metoda umożliwia jednak wizualne zaprojektowanie komponentu i użycie inspektora obiektów do utworzenia procedur obsługi zdarzeń.

Oto pytanie przepełnienie stosu, który pokazuje w jaki sposób zarejestrować Rama: How to Improve the Use of Delphi Frames