[ Pobierz całość w formacie PDF ]
.Write(FData^, FDataSize);end;procedure TddgWaveFile.SetWaveName(const Value: TWaveFileString);{ustalenie tytułu nagrania połączone z jego ładowaniem z pliku}beginif Value <> '' thenbeginFWaveName := ExtractFileName(Value);{ nie dokonuj odczytu z pliku, jeżeli trwa ładowanie ze strumienia }{ sprawdź, czy istnieje plik o podanej nazwie }if (not (csLoading in ComponentState)) and FileExists(Value)thenLoadFromFile(Value);endelsebegin{ ustawienie pustego tytułu jest równoznaczne z brakiem danychi uzasadnia zwolnienie przydzielonej dla nich pamięci}FWaveName := '';if not Empty thenFreeMem(FData, FDataSize);FDataSize := 0;end;end;procedure TddgWaveFile.Stop;{ Zatrzymuje bieżące odtwarzanie }beginif Assigned(FOnStop)thenFOnStop(Self); // wygeneruj zdarzeniePlaySound(Nil, 0, SND_PURGE);end;procedure TddgWaveFile.WriteData(Stream: TStream);{ zapisuje dane komponentu do strumienia }beginSaveToStream(Stream);end;end.Kategoryzacja właściwościPocząwszy od Delphi 5, właściwości komponentów VCL mogą być specyfikowane jako należące do poszczególnych kategorii i sortowane według tych kategorii w oknie inspektora obiektów.Zaliczenie właściwości do określonej kategorii następuje w wyniku wywołania funkcji RegisterPropertyInCategory(); analogiczną czynność w stosunku do zbioru właściwości wykonuje funkcja RegisterPropertiesInCategory().Obydwie funkcje zdefiniowane są w module DesignIntf.Pas.Funkcja RegisterPropertyInCategory()jest funkcją przeciążaną, dzięki czemu stosuje się ją do wielu rodzajów właściwości.Pierwszym parametrem wywołania każdego jej aspektu jest kategoria właściwości, dalsze parametry są specyficzne dla danego aspektu:function RegisterPropertyInCategory(ACategoryClass: TPropertyCategoryClass;const APropertyName: string): TPropertyFilter; overload;function RegisterPropertyInCategory(ACategoryClass: TPropertyCategoryClass;AComponentClass: TClass; const APropertyName: string): TPropertyFilter; overload;function RegisterPropertyInCategory(ACategoryClass: TPropertyCategoryClass;APropertyType: PTypeInfo; const APropertyName: string): TPropertyFilter; overload;function RegisterPropertyInCategory(ACategoryClass: TPropertyCategoryClass;APropertyType: PTypeInfo): TPropertyFilter; overload;Ta funkcja przystosowana jest ponadto do interpretacji znaków blankietowych (wildcards) — na przykład możemy zaliczyć do określonej kategorii wszystkie właściwości o nazwie rozpoczynającej się od „Data…”, specyfikując nazwę właściwości jako Data* (zajrzyj do opisu konstruktora TMask.Create() w systemie pomocy, gdzie opisane są dopuszczalne postaci wyrażeń blankietowych).Funkcja RegisterPropertiesInCategory() również jest funkcją przeciążoną:function RegisterPropertiesInCategory(ACategoryClass: TPropertyCategoryClass;const AFilters: array of const): TPropertyCategory; overload;function RegisterPropertiesInCategory(ACategoryClass: TPropertyCategoryClass;AComponentClass: TClass; const AFilters: array of string): TPropertyCategory; overload;function RegisterPropertiesInCategory(ACategoryClass: TPropertyCategoryClass;APropertyType: PTypeInfo; const AFilters: array of string): TPropertyCategory; overload;Klasy kategorii właściwościTyp TPropertyCategoryClass jest metaklasą obejmującą klasy zgodne z klasą TPropertyCategory, bazową dla wszystkich klas kategorii:TPropertyCategoryClass = class of TPropertyCategory;TPropertyCategory = class(TObject)privateFList: TObjectList;FMatchCount: Integer;FEditor: TPropertyEditor;FEnabled, FVisible: Boolean;FGroup: Integer;FName: string;protectedfunction GetFilter(Index: Integer): TPropertyFilter;publicconstructor Create(const AName: string);destructor Destroy; override;function Add(AFilter: TPropertyFilter): TPropertyFilter;function Count: Integer;function Match(const APropertyName: string; AComponentClass: TClass;APropertyType: PTypeInfo): Boolean;procedure ClearMatches;procedure FreeEditorGroup(AGroup: Integer);property Filters[Index: Integer]: TPropertyFilter read GetFilter;property MatchCount: Integer read FMatchCount;property Visible: Boolean read FVisible write FVisible;property Editor: TPropertyEditor read FEditor write FEditor;property Name: string read FName;end;Delphi 6 definiuje 12 standardowych klas kategorii, uwzględniających charakter i przeznaczenie różnorodnych właściwości; wymieniamy je w tabeli 12.4.Tabela 12.4.Standardowe klasy kategorii właściwości w Delphi 6Klasa kategoriiCharakter właściwościPrzykłady właściwościTActionCategoryWłaściwości związane z akcjami wykonywanymi w trakcie wykonania programuTControl.Enabled, TControl.HintTDatabaseCategoryWłaściwości związane z operacjami bazodanowymiTQuery.DataBase, TQuery.SQLTDragNDropCategoryWłaściwości związane z operacjami przeciągania oraz dokowaniaTControl.DragCursor, TControl.DragKindTHelpCategoryWłaściwości związane z systemem pomocy i podpowiedziamiTWinControl.Hint, TWinControl.HelpContextTLayoutCategoryWłaściwości określające wygląd kontrolki w czasie projektowaniaTControl.Top, TControl.LeftTLegacyCategoryWłaściwości związane z przestarzałymi operacjamiTWinControl.Ctl3D, TWinControl.ParentCtl3DTLinkageCategoryWłaściwości zapewniające związek pomiędzy komponentamiTDataSource.DataSetTLocaleCategoryWłaściwości związane z ustawieniami międzynarodowymiTControl.BiDiMode, TControl.ParentBiDiModeTLocalizableCategoryWłaściwości różnicowane w narodowych wersjach aplikacjiTytuły komponentów (Caption)TMiscellaneousCategoryWłaściwości nie zarejestrowane jawnie w żadnej innej kategoriiNazwy komponentów(Name), TSpeedButton.AllowAllUpTVisualCategoryWłaściwości związane z wyglądem komponentu w czasie wykonania programuTScrollBox.Align, TScrollBox.VisibleTInputCategoryWłaściwości związane z wprowadzaniem danych (poza kontekstem bazodanowym)TEdit.Enabled, TEdit.ReadOnlyPoniższa instrukcja dokonuje zaliczenia właściwości Keen komponentu TNeato do kategorii TActionCategory:RegisterPropertyInCategory(TActionCategory, TNeato, 'Keen');Powinna się ona znaleźć w treści procedury Register(), najlepiej w module definiującym komponent TNeato [ Pobierz całość w formacie PDF ]
zanotowane.pl doc.pisz.pl pdf.pisz.pl centka.pev.pl
.Write(FData^, FDataSize);end;procedure TddgWaveFile.SetWaveName(const Value: TWaveFileString);{ustalenie tytułu nagrania połączone z jego ładowaniem z pliku}beginif Value <> '' thenbeginFWaveName := ExtractFileName(Value);{ nie dokonuj odczytu z pliku, jeżeli trwa ładowanie ze strumienia }{ sprawdź, czy istnieje plik o podanej nazwie }if (not (csLoading in ComponentState)) and FileExists(Value)thenLoadFromFile(Value);endelsebegin{ ustawienie pustego tytułu jest równoznaczne z brakiem danychi uzasadnia zwolnienie przydzielonej dla nich pamięci}FWaveName := '';if not Empty thenFreeMem(FData, FDataSize);FDataSize := 0;end;end;procedure TddgWaveFile.Stop;{ Zatrzymuje bieżące odtwarzanie }beginif Assigned(FOnStop)thenFOnStop(Self); // wygeneruj zdarzeniePlaySound(Nil, 0, SND_PURGE);end;procedure TddgWaveFile.WriteData(Stream: TStream);{ zapisuje dane komponentu do strumienia }beginSaveToStream(Stream);end;end.Kategoryzacja właściwościPocząwszy od Delphi 5, właściwości komponentów VCL mogą być specyfikowane jako należące do poszczególnych kategorii i sortowane według tych kategorii w oknie inspektora obiektów.Zaliczenie właściwości do określonej kategorii następuje w wyniku wywołania funkcji RegisterPropertyInCategory(); analogiczną czynność w stosunku do zbioru właściwości wykonuje funkcja RegisterPropertiesInCategory().Obydwie funkcje zdefiniowane są w module DesignIntf.Pas.Funkcja RegisterPropertyInCategory()jest funkcją przeciążaną, dzięki czemu stosuje się ją do wielu rodzajów właściwości.Pierwszym parametrem wywołania każdego jej aspektu jest kategoria właściwości, dalsze parametry są specyficzne dla danego aspektu:function RegisterPropertyInCategory(ACategoryClass: TPropertyCategoryClass;const APropertyName: string): TPropertyFilter; overload;function RegisterPropertyInCategory(ACategoryClass: TPropertyCategoryClass;AComponentClass: TClass; const APropertyName: string): TPropertyFilter; overload;function RegisterPropertyInCategory(ACategoryClass: TPropertyCategoryClass;APropertyType: PTypeInfo; const APropertyName: string): TPropertyFilter; overload;function RegisterPropertyInCategory(ACategoryClass: TPropertyCategoryClass;APropertyType: PTypeInfo): TPropertyFilter; overload;Ta funkcja przystosowana jest ponadto do interpretacji znaków blankietowych (wildcards) — na przykład możemy zaliczyć do określonej kategorii wszystkie właściwości o nazwie rozpoczynającej się od „Data…”, specyfikując nazwę właściwości jako Data* (zajrzyj do opisu konstruktora TMask.Create() w systemie pomocy, gdzie opisane są dopuszczalne postaci wyrażeń blankietowych).Funkcja RegisterPropertiesInCategory() również jest funkcją przeciążoną:function RegisterPropertiesInCategory(ACategoryClass: TPropertyCategoryClass;const AFilters: array of const): TPropertyCategory; overload;function RegisterPropertiesInCategory(ACategoryClass: TPropertyCategoryClass;AComponentClass: TClass; const AFilters: array of string): TPropertyCategory; overload;function RegisterPropertiesInCategory(ACategoryClass: TPropertyCategoryClass;APropertyType: PTypeInfo; const AFilters: array of string): TPropertyCategory; overload;Klasy kategorii właściwościTyp TPropertyCategoryClass jest metaklasą obejmującą klasy zgodne z klasą TPropertyCategory, bazową dla wszystkich klas kategorii:TPropertyCategoryClass = class of TPropertyCategory;TPropertyCategory = class(TObject)privateFList: TObjectList;FMatchCount: Integer;FEditor: TPropertyEditor;FEnabled, FVisible: Boolean;FGroup: Integer;FName: string;protectedfunction GetFilter(Index: Integer): TPropertyFilter;publicconstructor Create(const AName: string);destructor Destroy; override;function Add(AFilter: TPropertyFilter): TPropertyFilter;function Count: Integer;function Match(const APropertyName: string; AComponentClass: TClass;APropertyType: PTypeInfo): Boolean;procedure ClearMatches;procedure FreeEditorGroup(AGroup: Integer);property Filters[Index: Integer]: TPropertyFilter read GetFilter;property MatchCount: Integer read FMatchCount;property Visible: Boolean read FVisible write FVisible;property Editor: TPropertyEditor read FEditor write FEditor;property Name: string read FName;end;Delphi 6 definiuje 12 standardowych klas kategorii, uwzględniających charakter i przeznaczenie różnorodnych właściwości; wymieniamy je w tabeli 12.4.Tabela 12.4.Standardowe klasy kategorii właściwości w Delphi 6Klasa kategoriiCharakter właściwościPrzykłady właściwościTActionCategoryWłaściwości związane z akcjami wykonywanymi w trakcie wykonania programuTControl.Enabled, TControl.HintTDatabaseCategoryWłaściwości związane z operacjami bazodanowymiTQuery.DataBase, TQuery.SQLTDragNDropCategoryWłaściwości związane z operacjami przeciągania oraz dokowaniaTControl.DragCursor, TControl.DragKindTHelpCategoryWłaściwości związane z systemem pomocy i podpowiedziamiTWinControl.Hint, TWinControl.HelpContextTLayoutCategoryWłaściwości określające wygląd kontrolki w czasie projektowaniaTControl.Top, TControl.LeftTLegacyCategoryWłaściwości związane z przestarzałymi operacjamiTWinControl.Ctl3D, TWinControl.ParentCtl3DTLinkageCategoryWłaściwości zapewniające związek pomiędzy komponentamiTDataSource.DataSetTLocaleCategoryWłaściwości związane z ustawieniami międzynarodowymiTControl.BiDiMode, TControl.ParentBiDiModeTLocalizableCategoryWłaściwości różnicowane w narodowych wersjach aplikacjiTytuły komponentów (Caption)TMiscellaneousCategoryWłaściwości nie zarejestrowane jawnie w żadnej innej kategoriiNazwy komponentów(Name), TSpeedButton.AllowAllUpTVisualCategoryWłaściwości związane z wyglądem komponentu w czasie wykonania programuTScrollBox.Align, TScrollBox.VisibleTInputCategoryWłaściwości związane z wprowadzaniem danych (poza kontekstem bazodanowym)TEdit.Enabled, TEdit.ReadOnlyPoniższa instrukcja dokonuje zaliczenia właściwości Keen komponentu TNeato do kategorii TActionCategory:RegisterPropertyInCategory(TActionCategory, TNeato, 'Keen');Powinna się ona znaleźć w treści procedury Register(), najlepiej w module definiującym komponent TNeato [ Pobierz całość w formacie PDF ]