Podstrony
- Strona startowa
- KRYZYS SUMIENIA RAYMOND FRANZ (PIERWSZE POLSKIE WYDANIE, 1996 ROK)
- Petersin Thomas Ogrodnik Szoguna
- Makuszynski Kornel Skrzydlaty chlopiec (SCAN dal 1
- Eco Umberto Wachadlo Foucaulta (SCAN dal 82
- Stephen King Zielona Mila (3)
- Pullman Philip Mroczne materie 1 Zorza północna (Złoty Kompas)
- Sagan Carl Kontakt (2)
- NeroBurningRom eng
- Slawomir Nowakowski Uroda i Zdrowie
- Word Studies in the New Testament Vol 1 & 2 (Marvin R Vincent)
- zanotowane.pl
- doc.pisz.pl
- pdf.pisz.pl
- odbijak.htw.pl
[ Pobierz całość w formacie PDF ]
.Fragment programu, odpowiedzialny za utworzenie i zarejestrowanieedytora atrybutu, przedstawiono na listingu 27.13.Listing 27.13.Tekst zródÅ‚owy edytora atrybutu SourceField.{ TSourceFieldProperty }typeTSourceFieldProperty = class(TStringProperty)publicfunction GetAttributes: TPropertyAttributes;¥' override;procedure GetValueList(List: TStrings);procedure GetValues(Proc: TGetStrProc); override;function GetTablePropName: string; virtual;end;function TSourceFieldProperty.GetAttributes:¥' TPropertyAttributes;beginResult := [paValueList, paSortList, paMultiSelect];end;function TSourceFieldProperty.GetTablePropName: string;beginResult := SourceTable ;end;procedure TSourceFieldProperty.GetValues(Proc: TGetStrProc);varI: Integer;Values: TStringList;beginValues := TStringList.Create;tryGetValueList(Values);for I := 0 to Values.Count - 1 do Proc(Values[I]);finallyValues.Free;end;end;procedure TSourceFieldProperty.GetValueList(List: TStrings);varInstance: TComponent;PropInfo: PPropInfo;SourceTable : TTable;beginInstance := TComponent(GetComponent(0));PropInfo := TypInfo.GetPropInfo(Instance.ClassInfo,¥' GetTablePropName);824 Część IVif (PropInfo nil) and (PropInfo^.PropType^.Kind =¥' tkClass) then beginSourceTable := TObject(GetOrdProp(Instance,¥' PropInfo)) as TTable;if (SourceTable nil) thenSourceTable.GetFieldNames(List);end;end;{& }RegisterPropertyEditor(TypeInfo(string), TZoomDialog,¥' SourceField , TSourceFieldProperty);WÅ‚asny edytor atrybutówDokÅ‚adniejsza analiza programu z listingu 27.13 pozwoli przeÅ›ledzić procestworzenia wÅ‚asnego edytora atrybutu.Proces ten rozpisać można na cztery etapy:1.Zdefiniowanie nowego, potomnego typu edytora atrybutu na podstawie jednegoz typów, zdefiniowanych w module DsgnIntf.2.Przygotowanie podprogramów zapewniajÄ…cych edycjÄ™ i prezentacjÄ™ atrybutuw formie tekstu.JeÅ›li atrybut nie należy do typu Å‚aÅ„cuchowego, to edytor musizapewnić odpowiedniÄ… konwersjÄ™.3.UdostÄ™pnienie informacji o okreÅ›lonych wÅ‚aÅ›ciwoÅ›ciach edytora, tak aby moduÅ‚Object Inspector byÅ‚ w stanie prawidÅ‚owo go obsÅ‚ugiwać.4.Zarejestrowanie edytora atrybutu przy użyciu proceduryRegisterPropertyEditor.W omawianym przykÅ‚adzie edytor SourceFieldProperty jest potomkiem klasyTStringProperty, zdefiniowanej w module DsgnIntf.Jedyna różnica pomiÄ™dzyedycjÄ… atrybutu SourceField a dowolnego innego atrybutu Å‚aÅ„cuchowego sprowadzasiÄ™ do uwzglÄ™dnienia rozwijanej listy dozwolonych nazw pól.Ponieważ bazowym typem atrybutu jest typ Å‚aÅ„cuchowy, nie jest koniecznedefiniowanie specjalnych procedur konwersji danych przy odczycie i zapisiewartoÅ›ci atrybutu.Procedury odziedziczone z klasy StringProperty bÄ™dÄ…dziaÅ‚aÅ‚y bez żadnych modyfikacji.SourceFieldProperty przekazuje Object Inspectorowi informacje o swoichwybranych wÅ‚aÅ›ciwoÅ›ciach za poÅ›rednictwem funkcji GetAttributes,przesÅ‚aniajÄ…cej odpowiedniÄ… funkcjÄ™ klasy TStringProperty.CiaÅ‚o funkcjiskÅ‚ada siÄ™ z jednego wiersza:RozdziaÅ‚ 27 Tworzenie wÅ‚asnych komponentów Delphi 825Result := [paValueList, paSortList, paMultiSelect];Object Inspector informowany jest o trzech specyficznych wÅ‚aÅ›ciwoÅ›ciach nowegoedytora.Po pierwsze, wartoÅ›ci obsÅ‚ugiwanego atrybutu pochodzÄ… z zamkniÄ™tejlisty.Po drugie, wartoÅ›ci a liÅ›cie, zwracane przez funkcjÄ™ GetValues, majÄ… byćsortowane.Wiele osób (w tym także sam autor) uważa automatyczne sortowaniedozwolonych wartoÅ›ci za uciążliwe; mimo to w omawianym, przykÅ‚adowymedytorze przyjÄ™to zasadÄ™ obowiÄ…zujÄ…cÄ… w odniesieniu do wszystkichstandardowych atrybutów VCL - dozwolone wartoÅ›ci sÄ… automatycznie sortowanena liÅ›cie.Ostatnia wÅ‚asność, paMultiSelect, umożliwia wyÅ›wietlanie/edycjÄ™atrybutu również w sytuacji, gdy na formularzu wybranych jest jednoczeÅ›nie kilkakomponentów.Niektórych atrybutów (np.Name) nie można modyfikowaćw odniesieniu do kilku komponentów jednoczeÅ›nie.W koÅ„cowej fazie przygotowywania nowego edytora atrybutu, wywoÅ‚ywana jestprocedura RegisterPropertyEditor:RegisterPropertyEditor (TypeInfo(string), TZoomDlg,'SourceField', TSourceFieldProperty);W wywoÅ‚aniu powyższej procedury należy podać cztery parametry:Typ danych, na których operuje edytor.Informacje o typie należy przekazywać,korzystajÄ…c z wbudowanej funkcji TypeInfo.komponentu, z którym powiÄ…zany jest edytor.JeÅ›li w miejscu tego parametruTypwystÄ™pować bÄ™dzie wartość nil, to edytora można bÄ™dzie używać w odniesieniu dowszystkich komponentów, zawierajÄ…cych atrybut okreÅ›lonego typu.Nazwa atrybutu, na którym edytor bÄ™dzie operowaÅ‚.Jest ona brana pod uwagÄ™tylko wówczas, gdy drugi parametr okreÅ›la typ komponentu.Klasa edytora, która ma zostać zarejestrowana jako wÅ‚aÅ›ciwa dla wskazanegotypu atrybutu.W omawianym przykÅ‚adzie w wywoÅ‚aniu RegisterPropertyEditorokreÅ›lono Å‚aÅ„cuchowy typ atrybutu.Edytor bÄ™dzie obsÅ‚ugiwaÅ‚ wyÅ‚Ä…cznie atrybutSourceField komponentu ZoomDlg.Inne specyficzne cechy komponentu ZoomDlg.Kluczowe znaczenie dla funkcjonowania komponentu ZoomDlg ma fragmentprogramu skojarzony ze zdarzeniem OnClick przycisku OK na formularzuZoomForm.Oto wspomniany fragment:procedure TfmZoom.bbOKClick(Sender: TObject);begin826 Część IVIf Caller is TDBEdit then beginWith Caller as TDBEdit do beginIf (not (DataSource.DataSet.State in [dsInsert,¥' dsEdit])) thenDataSource.DataSet.Edit;DataSource.DataSet.FieldByName(DataField).¥' AsString:=dsZoom.DataSet.FieldByName¥' (SourceField).AsString;end;end else If Caller is TCustomEdit then beginWith Caller as TCustomEdit do beginClear;Text:=dsZoom.DataSet.FieldByName(SourceField).¥' AsString;end;end else If Caller is TComboBox then beginWith Caller as TComboBox do beginClear;Text:=dsZoom.DataSet.FieldByName(SourceField).¥' AsString;end;end else If Caller is TDBComboBox then beginWith Caller as TDBComboBox do beginIf (not (DataSource.DataSet.State in [dsInsert,¥' dsEdit])) thenDataSource.DataSet.Edit;DataSource.DataSet.FieldByName(DataField).¥' AsString:=dsZoom.DataSet.FieldByName¥' (SourceField).AsString;end;end;ModalResult := mrOK;end;SzczególnÄ… uwagÄ™ zwrócić należy na intensywne wykorzystanie mechanizmuRTTI (ang.Runtime Type Information - uzyskiwanie informacji o typie danychpodczas wykonywania programu).WiÄ™kszość jÄ™zyków kompilowanych do kodumaszynowego nie oferuje mechanizmu RTTI.Delphi jest jednak nietypowymnarzÄ™dziem, wyposażonym w wiele możliwoÅ›ci, których brak w innych,podobnych produktach.W omawianym przykÅ‚adzie mechanizm RTTIwykorzystano w module ZoomForm do okreÅ›lenia typu komponentu, któryspowodowaÅ‚ przywoÅ‚anie na ekran formularza.ZnajÄ…c typ kontrolki, ZoomDlgmoże prawidÅ‚owo wpisać nazwÄ™ pola.Należy ponadto zwrócić uwagÄ™ na konstrukcjÄ™ With
[ Pobierz całość w formacie PDF ]