W poprzednim wpisie zapoznaliśmy się z konfiguracją komponentu VirtualStringTree. Dzisiaj przejdziemy do zarządzania danymi.
Dane w VirtualStringTree (VST) zorganizowane są w postaci nodów. Każdy taki nod może wskazywać na swoje rodzeństwo, czyli na nod poprzedni i kolejny. Dodatkowo może posiadać nody podrzędne, czyli dzieci oraz wskazywać na dane zapisane w postaci rekordu. Właśnie ten wskaźnik na dane posłuży nam na przechowanie informacji o stacjach.
Dodawanie danych
Załóżmy, że listę stacji pobraliśmy z bazy danych i chcemy ją teraz umieścić w VST. Aby to zrobić musimy przede wszystkim utworzyć klasę oraz rekord na dane, który podepniemy pod noda.
type
TStationNodeData = class
protected
FID : string;
FName : string;
FGenre : string;
FCountry : string;
public
constructor Create(const Id: string;
const Name, Genre, Country: string); overload;
property ID : string read FID write FID;
property Name : string read FName write FName;
property Genre : string read FGenre write FGenre;
property Country : string read FCountry write FCountry;
end;
PStationNodeRec = ^TStationNodeRec;
TStationNodeRec =
record
snd : TStationNodeData;
end;
Musimy pamiętać o ustaleniu rozmiaru danych jakie będą spięte z nodem. Możemy to zrobić podczas konfiguracji VST
procedure TMainForm.VstStationListGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); begin NodeDataSize := SizeOf(TStationNodeRec); end;
Pobrana wcześniej lista stacji reprezentowana jest przez obiekt query. Iterując po kolekcji w łatwy sposób dodamy wszystkie stacje do VST.
VstList.Clear;
VstList.RootNodeCount := query.RecordCount;
VstList.ReinitNode(VstList.RootNode, True);
VstList.BeginUpdate;
node := nil;
try
while not query.EOF do
begin
if node = nil then
node := VstList.GetFirst
else
node := VstList.GetNext(node);
data := VstList.GetNodeData(node);
data^.snd := TStationNodeData.Create(
query.FieldByName('ID').AsString,
query.FieldByName('Name').AsString,
query.FieldByName('GenreText').AsString,
query.FieldByName('CountryText').AsString
);
if (selectedId <> EMPTY_STR) and (query.FieldByName('ID').AsString = selectedId) then
VstList.Selected[node] := true;
query.Next;
end;
finally
Finalize(node^);
end;
VstList.EndUpdate;
Edycja danych
Aby edytować dane bezpośrednio w komponencie VST musimy wskazać interesujący nas nod i pobrać rekord z danymi. Możemy to zrobić np. przy pomocy kilku dostępnych metod wystawionych przez VST.
procedure EditData(var VstList: TVirtualStringTree)
var
node, prevNode, nextNode: PVirtualNode;
data: PStationNodeRec;
begin
// pobranie pierwszego noda
node := VstList.GetFirst();
// pobranie ostatniego noda
node := VstList.GetLast();
// pobranie zaznaczonego noda
node := VstList.GetFirstSelected();
// mając referencję możemy również pobrać bezpośrednich sąsiadów
prevNode := VstList.GetPrevious(node);
nextNode := VstList.GetNext(node);
if node <> nil then
data := VstList.GetNodeData(node);
// edycja danych
data^.snd.Genre := 'Dance';
end;
Usuwanie danych
Usuwanie wygląda bardzo podobnie do edycji z tą różnicą, że wołamy metodę DeleteNode.
procedure DeleteSelectedData(var VstList: TVirtualStringTree) var node: PVirtualNode; begin // pobranie zaznaczonego noda node := VstList.GetFirstSelected(); VstList.DeleteNode(node); end;
Kod aplikacji dostępny jest na GitHubie.
- Tiny Radio Player #01 – Wprowadzenie
- Tiny Radio Player #02 – Instalacja komponentów
- Tiny Radio Player #03 – Roboczy interfejs aplikacji
- Tiny Radio Player #04 – Budujemy silnik
- Tiny Radio Player #05 – Zapis ustawień aplikacji
- Tiny Radio Player #06 – Zmiana języka aplikacji
- Tiny Radio Player #07 – Logowanie błędów
- Tiny Radio Player #08 – Baza danych
- Tiny Radio Player #09 – Zarządzanie bazą SQLite
- Tiny Radio Player #10 – Lista stacji radiowych, konfiguracja VirtualTreeView
- Jesteś tu => Tiny Radio Player #11 – Lista stacji radiowych, zarządzanie danymi w VirtualStringTree
