Hallo,
Wer keine Lust hat sich die hintergründe durch zu lesen kann gleich bis zum Source: "Variante1:" scrollen
ich steh vor nem kleinen Problem. Es schreib an einer MusicSoftware die mehrere Playlisten hat. Wenn ein Lied gespielt wurde soll dies natürlich in allen Listen angezeigt werden und nicht nur in der wo es gespielt wurde.
Deswegen hab ich eine Hauptplayliste und viele Normale Playlisten welche auf die Hauptplayliste verweisen.
Wird ein neues Lied zu irgend einer Playliste hinzugefügt, wird es nur in der Hauptplayliste erstellt. In der eigentlichen Playliste wird dann der gleiche Record angelegt und die Items darin zeigen dann auf die Items der Hauptliste (siehe sourceschnipsel)
Delphi-Quellcode:
PBoolean = ^Boolean;
PString = ^String;
PInteger = ^Integer;
TJBFileInfo = record
Filename: String;
FilenameP: PString; //in Hauptliste zeigts auf Filename - In normaler Liste zeigts auf Filename von Hauptliste
Interpret: String;
InterpretP: PString;
Title: String;
TitleP: PString;
Genre: String;
GenreP: PString;
FileTime: Integer;
FileTimeP: PInteger;
AddedBySearch: Boolean;
AllreadyPlayed: Boolean;
AllreadyPlayedP: PBoolean;
IsSelected: Boolean; //legt fest ob das Item selectiert ist oder nicht (deswegen geht auch nicht ein Pointer auf den gesamten Record)
end;
Nun zum eigentlichen Problem. Wenn ich ein Lied aus irgend einer Playliste in eine andere kopiere, ist es ja das einfachste einfach das Item(den Record) aus der Hauptliste zu kopieren.
Dabei würden ja aber auch die Strings und alles mit kopiert werden (ich brauch aber nur die Pointer). Soll ich nun jeden Pointer einzeln kopieren oder den gesamten record?
Variante1:
Delphi-Quellcode:
procedure CopieItem(AItem: TJBFileInfo);
var NewItem: TJBFileInfo;
begin
NewItem := AItem;
{NewItem zu Playliste hinzufügen}
end;
Variante2:
Delphi-Quellcode:
procedure CopieItem(AItem: TJBFileInfo);
var NewItem: TJBFileInfo;
begin
NewItem.FilenameP := AItem.FilenameP;
NewItem.InterpretP : AItem.InterpretP;
NewItem.TitleP : AItem.TitleP;
NewItem.GenreP : AItem.GenreP;
NewItem.FileTimeP : AItem.FiletimeP;
NewItem.AllreadyPlayedP : AItem.AllreadyPlayedP;
{NewItem zu Playliste hinzufügen}
end;
Welche Variante würded ihr nehmen Wenn ihr nur die Pointer aus dem Record braucht?
Variante1 = Mehr speicherverbrauch
Variante2 = Mehr zuweisungen
Oder gibts noch ne dritte effektivere Variante?
(keine Kommentare zu "PString = ^String;" - ich weiß selbst das dies ein pointer auf einen Pointer ist)