P...
Serwis znalezionych hasełOdnośniki
- Smutek to uczucie, jak gdyby się tonęło, jak gdyby grzebano cię w ziemi.
- – Mój przyjacielu, sprawa jest bardzo poważna i możecie narazić się na duże przykrości, jeżeli ukrywacie cokolwiek przede mną...
- \par cech, w kt\'f3rej badacze wyr\'f3\'bfniaj\'b9 elementy achajskie (nie wymienili\'9c-\par my tego dialektu w nazwanych wy\'bfej grupach, bo p\'f3\'9fniej nie...
- - Mężu mój! - zawołała, ale w owej chwili nie patrzyła na króla, tylko na Amasę...
- i przez to trochę pomniejszony wyznawca Jarosława oraz Jan B...
- Całe towarzystwo ruszyło naprzód...
- with some lucky lady...
- powóz
- Przestrzeń pośrodku koncentrycznych osłon miała około sześciu metrów średnicy...
- Może Kitchener zastosowałby politykę spalonej ziemi bez sugestii Seana...
- Jak się okazało, nie tylko Valentine z Jaktem przeprowadzili się na statek Mira...
Smutek to uczucie, jak gdyby się tonęło, jak gdyby grzebano cię w ziemi.
EditorClass := EditorClass;
PropertyClassList.Insert(0, P);
end;
Jest to poniekąd zrozumiałe: informacja o typie rejestrowanego edytora pobierana jest najczęściej z permanentnie rezydujących struktur RTTI — opisane przed chwilą „ręczne” tworzenie
struktur TTypeInfo wykonywane jest stosunkowo rzadko. Ponadto informacja ta musi być
pobrana z RTTI, jeżeli rejestrowany edytor zastąpić ma inny edytor zarejestrowany w taki właśnie sposób.
Zasady zastępowania edytorów właściwości
Zarejestrowanie nowego edytora właściwości wprowadza oczywiście pewne zmiany w
przyporządkowaniu określonych edytorów określonym właściwościom określonych
komponentów. Mimo oczywistości tego faktu rządzące tym zjawiskiem reguły nie są jednak tak
oczywiste — wszak konkretny edytor może być przyporządkowany całej grupie właściwości
danego typu, być może pochodzących z różnych komponentów.
Otóż aby nowo rejestrowany edytor zastąpił dotychczasowy edytor dla konkretnej
właściwości, musi on cechować się co najmniej takim samym stopniem „specjalizacji” jak
edytor istniejący. Jeżeli więc na przykład istnieje zarejestrowany w IDE edytor dla właściwości
TShape komponentu TShapeType, po zarejestrowaniu nowego edytora dla właściwości typu
TShape dowolnego komponentu właściwość TShapeType::TShape obsługiwana będzie
nadal przez edytor dotychczasowy, jako ukierunkowany na konkretną klasę komponentu, czyli
bardziej specjalizowany. Nowy edytor uruchamiany będzie przez IDE tylko dla właściwości
TShape tych komponentów, dla których nie istnieje dedykowany (tj. ukierunkowany na
konkretną klasę komponentu) edytor właściwości TShape.
Wykorzystanie grafiki w edytorach
właściwości
Począwszy od wersji 5 C++Buildera niektóre edytory właściwości ilustrują wyświetlane wartości
stosownymi ikonami, co czyni edycję bardziej intuicyjną i wygodniejszą dla użytkownika,
mogącego teraz a priori poznać np. wygląd wybranego kursora. Edytory te wymienione zostały w
tabeli 2.4 (w rozdziale 2); te z nich, które występują na rysunku 10.1, znajdują się na tle
zacienionym. W związku z tym bazowa klasa wszystkich edytorów właściwości —
TPropertyEditor — wzbogacona została o sześć nowych metod. Treść pięciu z nich,
wymienionych poniżej, charakterystyczna jest dla klasycznej, „tekstowej” reprezentacji
właściwości, wymaga więc przedefiniowania w klasie pochodnej posługującej się dodatkowo
wspomnianymi ikonami:
DYNAMIC void __fastcall ListMeasureWidth(const AnsiString Value,
Graphics::TCanvas*ACanvas,
int&AWidth);
DYNAMIC void __fastcall ListMeasureHeight(const AnsiString Value,
Graphics::TCanvas*ACanvas,
int&AHeight);
DYNAMIC void __fastcall ListDrawValue(const AnsiString Value,
Graphics::TCanvas*ACanvas,
const Windows::TRect&ARect,
bool ASelected);
DYNAMIC void __fastcall PropDrawValue(Graphics::TCanvas*ACanvas,
const Windows::TRect&ARect,
bool ASelected);
DYNAMIC void __fastcall PropDrawName(Graphics::TCanvas*ACanvas,
const Windows::TRect&ARect,
bool ASelected);
Metody te współdziałają z pozostałą, szóstą metodą:
AnsiString __fastcall GetVisualValue();
Znaczenie wymienionych metod wyjaśnia tabela 10.8.
Tabela 10.8 Nowe metody edytora właściwości
związane z wyświetlaniem ikon
Metoda Opis
ListMeasureWidth() Umożliwia zmianę domyślnej szerokości przeznaczonej na
wyświetlenie danej wartości w liście; największa z ostatecznych
szerokości poszczególnych wartości jest jednocześnie dolną granicą
szerokości całej listy.
ListMeasureHeight() Umożliwia zmianę domyślnej wysokości przeznaczonej na
wyświetlenie danej wartości w liście; wywołanie tej metody jest
konieczne, jeżeli domyślna wysokość, wynikająca z tekstowej
reprezentacji wartości, jest niewystarczająca do wyświetlenia
towarzyszącej ikony.
ListDrawValue()
Dokonuje wyświetlenia wartości w liście.
PropDrawValue()
Określa wygląd pola wartości danej właściwości w sytuacji, gdy
właściwość ta nie jest aktualnie edytowana (w czasie edycji pole to
ma zawsze postać edytowalnego łańcucha AnsiString).
PropDrawName()
Określa wygląd pola nazwy danej właściwości.
GetVisualValue()
Istotą tej metody jest zapewnienie poprawnej postaci pola wartości
danej właściwości w sytuacji, gdy zaznaczonych jest kilka
komponentów. Jeżeli metoda AllEqual() zwraca wartość true
to oznacza, że wynikiem metody GetValue() jest wspólna
wartość właściwości dla wszystkich komponentów — i ta właśnie
wartość zwracana jest jako wynik metody GetVisualValue().
Zwrócenie przez metodę AllEqual() wartości false stanowi
sygnał, iż nie można określić wspólnej wartości dla wszystkich
zaznaczonych komponentów i metoda GetVisualValue()
zwraca wówczas wartość true. Ten aspekt ogólnie pojętego
edytowania właściwości ma charakter uniwersalny, niezależny od
konkretnego edytora, dlatego też nie przewidziano możliwości
przedefiniowywania metody GetVisualValue() w klasach
pochodnych edytorów.
Symboliczny wpływ wymienionych metod na wygląd poszczególnych elementów Inspektora
Obiektów przedstawia rysunek 10.3.
Tutaj proszę umieścić rysunek z pliku ORIG-10-3.BMP i uzupełnić go oryginalnymi napisami towarzyszącymi mu na stronie 442 oryginału, z następującą zmianą:
Object Inspector -> Inspektor Obiektów
Rysunek 10.3 Związek wybranych metod edytora właściwości z oknem Inspektora Obiektów
Jak już wcześniej wspominaliśmy, przy tworzeniu nowego edytora właściwości należy poważnie
zastanowić się nad wyborem jego klasy bazowej — jeżeli przykładowo docelowa właściwość
będzie właściwością całkowitoliczbową, najbardziej prawdopodobnym kandydatem do tej roli
będzie klasa TIntegerProperty. Na wydruku 10.10 przedstawiamy deklarację
przykładowego edytora wyprowadzonego z klasy TEnumProperty; zakładamy przy tym, iż
poza wzbogaceniem tej ostatniej o wyświetlanie ikon ilustrujących poszczególne wartości
pozostałe aspekty jej funkcjonowania pozostają niezmienione.
Wydruk 10.10 Deklaracja edytora właściwości
wzbogacającego klasę bazową o wyświetlanie ikon
dla poszczególnych wartości
#include "DsgnIntf.hpp"
class TCustomImagePropertyEditor : public TEnumProperty
{
typedef TEnumProperty inherited;
public:
DYNAMIC void __fastcall ListMeasureWidth(const AnsiString Value,
Graphics::TCanvas* ACanvas,
int& AWidth);