X


[ Pobierz całość w formacie PDF ]
.Przykład użycia DefineProperty()Na wydruku 12.7 znajduje się kod modułu implementującego przykładowy komponent, przechowujący w strumieniu zawartość dwóch prywatnych pól, będących (kolejno) łańcuchem (FString) i liczbą całkowitą (FInteger).Wydruk 12.7.Przykład zastosowania DefineProperty()unitDefProp;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;typeTDefinePropTest = class(TComponent)privateFString: String;FInteger: Integer;procedure ReadStrData(Reader: TReader);procedure WriteStrData(Writer: TWriter);procedure ReadIntData(Reader: TReader);procedure WriteIntData(Writer: TWriter);protectedprocedure DefineProperties(Filer: TFiler); override;publicconstructor Create(AOwner: TComponent); override;end;implementationconstructor TDefinePropTest.Create(AOwner: TComponent);begininherited Create(AOwner);{ Nadaj polom danych przykładową zawartość }FString := 'Wynikiem działania jest.';FInteger := 42;end;procedure TDefinePropTest.DefineProperties(Filer: TFiler);begininherited DefineProperties(Filer);{ wywołania definiujące sposób zapisu i odczytu pól}Filer.DefineProperty('StringProp', ReadStrData, WriteStrData, FString <> '');Filer.DefineProperty('IntProp', ReadIntData, WriteIntData, True);end;{ Metody transmisyjne }procedure TDefinePropTest.ReadStrData(Reader: TReader);// odczyt pola FString;beginFString := Reader.ReadString;end;procedure TDefinePropTest.WriteStrData(Writer: TWriter);// zapis pola FString;beginWriter.WriteString(FString);end;procedure TDefinePropTest.ReadIntData(Reader: TReader);// odczyt pola FInteger;beginFInteger := Reader.ReadInteger;end;procedure TDefinePropTest.WriteIntData(Writer: TWriter);// zapis pola FInteger;beginWriter.WriteInteger(FInteger);end;end.W powyższym przykładzie odziedziczona metoda DefineProperties() uzupełniona została dwoma wywołaniami DefineProperty().Pierwsze z tych wywołań informuje, iż w strumieniu przechowywana będzie porcja danych identyfikowana przez nazwę StringProp; za jej odczyt (odpowiednio: zapis) odpowiedzialne będą metody ReadStrData (odpowiednio: WriteStrData).Porcji tej nie należy jednak tworzyć, jeżeli pole FString zawiera łańcuch pusty.Na podobnej zasadzie drugie ze wspomnianych wywołań definiuje tworzoną bezwarunkowo porcję o nazwie IntProp, obsługiwaną przez metody ReadIntData i WriteIntData.OstrzeżenieNależy uważać, by nie pomylić metod ReadString() i WriteString() klas TReader i TWriter z podobnie brzmiącymi metodami ReadStr() i WriteStr(); gdyż spowodowałoby to zniszczenie pliku.DFM.Przykład użycia DefineBinaryProperty() — komponent TddgWaveFileJak już wcześniej wspominaliśmy, przykładem danych niesformatowanych, predestynowanych do obsługi za pomocą metody DefineBinaryProperty(), są róż­nego rodzaju wzorce graficzne oraz dźwiękowe — i rzeczywiście: znakomita większość komponentów VCL wykorzystuje tę metodę do przechowywania ikon swych komponen­tów, że wspomnimy tu o właściwości Icon formularza albo właściwości Glyph przyci­sku TBitBtn.NotatkaKomponent TddgWaveFile jest komponentem w pełni funkcjonalnym, posiada m.in.specjalizowany edytor pozwalający na „przesłuchanie” przypisanego wzor­ca dźwiękowego podczas projektowania aplikacji, bez konieczności jej urucha­miania.Jego możliwościami zajmiemy się nieco później, obecnie skoncentrujemy się na mechanizmie przechowywania wzorca dźwiękowego w strumieniu.Metoda DefineBinaryPropety() nie rozróżnia (w przeciwieństwie do metody DefineProperty()) typu funkcji odczytującej i zapisującej — obydwie te funkcje posiadają wspólny typ (TStreamProc) i są metodami klasy TStream, reprezentującej strumień danych.Metoda DefineProperties() komponentu TddgWaveFile zdefiniowana jest następująco:procedure TddgWaveFile.DefineProperties(Filer: TFiler);{definiuje materiał dźwiękowy, wskazywany przez pole FData,jako porcję danych niesformatowanych określanych nazwą "Data"}function DoWrite: Boolean;beginif Filer.Ancestor <> nilthenResult := not (Filer.Ancestor is TddgWaveFile)ornot Equal(TddgWaveFile(Filer.Ancestor))elseResult := not Empty;end;begininherited DefineProperties(Filer);Filer.DefineBinaryProperty('Data', ReadData, WriteData, DoWrite);end;Jak widać, definiowana jest tu porcja danych identyfikowana przez nazwę Data, obsługiwana przez procedury transmisyjne ReadData() i WriteData(); jej obecność w strumieniu zależna jest od wyniku zwracanego przez funkcję DoWrite(), którą zajmiemy się za chwilę.Działanie ReadData i WriteData ogranicza się do (odpowiednio) odczytu danych komponentu ze strumienia i zapisu danych w strumieniu:procedure TddgWaveFile.ReadData(Stream: TStream);{ odczytuje dane ze strumienia }beginLoadFromStream(Stream);end;procedure TddgWaveFile.WriteData(Stream: TStream);{ zapisuje dane komponentu do strumienia }beginSaveToStream(Stream);end;Metoda LoadFromStream() sprawdza wpierw, czy do komponentu zostały już załadowane jakieś dane; jeżeli jest tak istotnie, zwalnia przydzieloną dla nich pamięć, przydziela ją ponownie w rozmiarze odpowiadającym rozmiarowi strumienia i wczytuje do niej dane zawarte w strumieniu:procedure TddgWaveFile.LoadFromStream(S: TStream);{Wczytuje dane ze strumienia, zwalniając pamięć zajętą przezew.dane załadowane wcześniej}beginif not Empty thenFreeMem(FData, FDataSize);FDataSize := 0;FData := AllocMem(S.Size);FDataSize := S.Size;S.Read(FData^, FDataSize);end;Metoda SaveToStream() jest nieco prostsza: zapisuje dane w strumieniu, sprawdziwszy jednak uprzednio, czy w ogóle jest co zapisywać:procedure TddgWaveFile.SaveToStream(S: TStream);{ Zapisuje dane do strumienia }beginif not EmptythenS.Write(FData^, FDataSize);end;Funkcja DoWrite(), decydująca o tym, czy dane mają być w ogóle zapisywane, rozwiązuje tu pewien problem, który pojawił się wraz z możliwością dziedziczenia formularzy (Visual Form Inheritance), na przykład z repozytorium, za pomocą opcji Inherit.Nie można wykluczyć sytuacji, iż komponent TddgWaveFile jest częścią formularza macierzystego i jako taki jest dziedziczony przez formularz projektu [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • katek.htw.pl






  • Formularz

    POst

    Post*

    **Add some explanations if needed

    Drogi użytkowniku!

    W trosce o komfort korzystania z naszego serwisu chcemy dostarczać Ci coraz lepsze usługi. By móc to robić prosimy, abyś wyraził zgodę na dopasowanie treści marketingowych do Twoich zachowań w serwisie. Zgoda ta pozwoli nam częściowo finansować rozwój świadczonych usług.

    Pamiętaj, że dbamy o Twoją prywatność. Nie zwiększamy zakresu naszych uprawnień bez Twojej zgody. Zadbamy również o bezpieczeństwo Twoich danych. Wyrażoną zgodę możesz cofnąć w każdej chwili.

     Tak, zgadzam się na nadanie mi "cookie" i korzystanie z danych przez Administratora Serwisu i jego partnerów w celu dopasowania treści do moich potrzeb. Przeczytałem(am) Politykę prywatności. Rozumiem ją i akceptuję.

     Tak, zgadzam się na przetwarzanie moich danych osobowych przez Administratora Serwisu i jego partnerów w celu personalizowania wyświetlanych mi reklam i dostosowania do mnie prezentowanych treści marketingowych. Przeczytałem(am) Politykę prywatności. Rozumiem ją i akceptuję.

    Wyrażenie powyższych zgód jest dobrowolne i możesz je w dowolnym momencie wycofać poprzez opcję: "Twoje zgody", dostępnej w prawym, dolnym rogu strony lub poprzez usunięcie "cookies" w swojej przeglądarce dla powyżej strony, z tym, że wycofanie zgody nie będzie miało wpływu na zgodność z prawem przetwarzania na podstawie zgody, przed jej wycofaniem.