[ 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