![]() |
StringList weiter reichen zur Eigentliche Klasse
Hallo,
ich möchte gerne wie im Titel schon beschrieben steht eine TStringList weiter reichen. Am Anfang wird eine Variable aus der Haupt Klasse(TPlayListManger) mit einer ListBox1.Items verbunden. Jetzt Lade ich eine Datei und sie wird auch in der ListBox angezeigt. Nun Möchte ich von einem Button Klick den Inhalt der Variable aus Klasse(TPlayListManger) anzeigen lassen. Aber sie ist leer warum ? Hier mal mein Soruce Code. Ich sehe einfach keinen Fehler. Oder verstehe ich das mit den Pointern falsch ?
Delphi-Quellcode:
Ich hoffe da steigt einer von euch durch. Im Prinzip ist das ein ganz einfacher Weg. Aber irgendwo in diesen Methoden muss ein Fehler sein.
TPlaylistenManger = class
fOnAddPlayListe: TOnAddPlayliste; fOnGetPlayListeItem:TOnGetPlaylisteItem; private procedure InitPlaylist(const aFileName:String; var aPlayliste:TPlaylistBase); protected public _ext:string; FileName:String; PlayListItems:TStrings; OhneExt:Boolean; Playliste:TPlaylistBase; constructor Create; destructor Destroy; .... procedure TPlaylistenManger.InitPlaylist(const aFileName: String; var aPlayliste: TPlaylistBase); var ext:String; begin ext:=UpperCase(ExtractFileExt(aFileName)); if ext = '.M3U' then aPlayliste:=TPlayListM3U.Create; // if ext = 'PLS' then aPlayliste:=TPlayList.Create; end; // Hier lade ich eine M3U Datei procedure TPlaylistenManger.LoadFromFile(const aFileName: String = ''); var i:integer; begin InitPlaylist(ExtractFileName(aFileName),Playliste); Playliste.OhneExt:=OhneExt; Playliste.PlayListItems:=PlayListItems; Playliste.LoadFromFile(aFileName); // PlayListItems.Assign(Playliste.PlayListItems); _ext:=Playliste.ext; end; procedure TPlayListM3U.LoadFromFile(const aFileName: String); var tmp:TStrings; i,m:Integer; str:String; Item:TInfo; begin tmp:=TStringList.Create; with tmp do begin LoadFromFile(aFileName); m:=0; if UpperCase(Strings[0]) = '#EXTM3U' then begin m:=1; ext:='#EXTM3U'; end else ext:=''; i:=m; while i <= Count-1 do begin str:=strings[i]; Item:=TInfo.Create; if (str <> '') and (str[1] = '#') then begin Item.Kometar:=str; Item.FileName:=strings[i+1]; if OhneExt then PlayListItems.AddObject(SplitStr(ExtractFileName(Item.FileName),'.'),Item) else PlayListItems.AddObject(ExtractFileName(Item.FileName),Item); inc(i,2); end else begin if (str <> '') and (str[1] <> '#') then begin Item.Kometar:=''; Item.FileName:=strings[i]; if OhneExt then PlayListItems.AddObject(SplitStr(ExtractFileName(Item.FileName),'.'),Item) else PlayListItems.AddObject(ExtractFileName(Item.FileName),Item); inc(i); end; end; end; // for i:=0 end; // tmp tmp.free; end; ... Vielen Dank schonmal für eure Hilfe .... Edit00: In dieser Version, werden alle Daten angezeigt. Nur wenn ich in einem Button von From1 jetzt die alle Items anzeigen möchte, steht in der StringList: PlayListeManger.PlayListItems.Text nix drin. obwohl PlayListeManger Global Definiert ist.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin PlayListeManger:=TPlaylistenManger.Create; PlayListeManger.PlayListItems:=ListBox1.Items; PlayListeManger.LoadFromFile('/media/hda7/Daten/music/entspannung.m3u'); // :=; end; |
Re: StringList weiter reichen zur Eigentliche Klasse
Im LoadFromFile() übernimmst du die Instanz der TStrings-Instanz von einem anderen Control anstatt dir in deinem PLaylistmanager selber eine im Constructor anzulegen (im Destructor freizugeben) und über eine Property zu veröffentlichen. Dabei im Setter die Assign() Methode nutzen, um deine Instanz zu schützen.
|
Re: StringList weiter reichen zur Eigentliche Klasse
ich kann die leider nicht so ganz folgen......
per Assign() habe ich das auch schon versucht.... |
Re: StringList weiter reichen zur Eigentliche Klasse
Delphi-Quellcode:
type
TPlaylistenManager = class private fPlayListItems: TStrings; procedure SetPlaylistItems(const AValue: TStrings); public constructor Create; destructor Destroy; override; // <--- override vergessen!!! property PlaylistItems: TStrings read fPlaylistItems write SetPlaylistItems; end; ... constructor TPlaylistenManager.Create; begin inherited; fPlaylistItems := TStringList.Create; end; destructor TPlaylistenManager.Destroy; begin fPlaylistItems.Free; inherited; end; procedure TPlaylistenManager.SetPlaylistItems(const AValue: TStrings); begin fPlaylistItems.Assign(AValue); // <<-- damit du dir nicht deine eigene Instanz von aussen überschreiben lässt!! end; |
Re: StringList weiter reichen zur Eigentliche Klasse
VIELEN DANK für den code,
doch leider wird jetzt die Playliste nicht mehr in der ListBox Angezeigt. Ich habe deinen Code genau so übernommen, wie du ihn vorgeschlagen hast. Dafür kann ich jetzt von ausen auf PlayListItems zugreifen. Ich wollte eigentlich die Listbox mit der Eigenschaft: PlayListItems verbinden. so das sie gleich bedeutet sind. |
Re: StringList weiter reichen zur Eigentliche Klasse
Warum weist du nicht nach dem Laden einfach deine Playlistitems wieder der Listbox.items zu? Damit aktualisierst du diese. Man sollte eh Oberfläche und Daten trennen und genau das haben wir dann entsprechend getan.
|
Re: StringList weiter reichen zur Eigentliche Klasse
naja, ich wollte die Listbox1.items nur einmal zuweisen und nicht nach jeder Änderung.
Das müsste doch gehen oder nicht ? Ich möchte das PlaylistItems von der PlaylistManger Classe nur auf Listbox1.Items zeigt. und wenn ich intern auf PlaylistItem zugreife z.b. um ein Eintrag auszugeben, dann müsste ich doch eigentlich ListBox1.Items ansprechenden oder nicht ? Wenn das nicht geht, müsste ich ein Event dazu packen, dann währe das aber mehr Aufwand . Ich wollte die Verwendung so einfach wie nur möglich machen. |
Re: StringList weiter reichen zur Eigentliche Klasse
Nein, wenn du es wirklich so machen willst, dann war dein erster Code genau der richtige. Beachte dabei aber, dass du mit der Klasse nicht mehr auf die Instanz zugreifst, wenn die Listbox nicht mehr existiert etc.
|
Re: StringList weiter reichen zur Eigentliche Klasse
Genau dieser Code geht ja nicht.
Im Prinzip möchte ich ein mischmasch von deinem code und meinem. Ich möchte auf PlaylistItems von der Klasse TPlaylistManger zugreifen können und von der Listbox aus. und das geht mit meinem Code leider nicht. und ich weiß nicht warum. jedes mal wenn ich versuche nach dem Laden auf PlaylistItems zuzugreifen ist die liste leer. Was aber gar nicht sein dürfte, da sie ja mit der von der Listbox verbunden ist. |
Re: StringList weiter reichen zur Eigentliche Klasse
Zitat:
Und korrigiere das schon vorhin von mir im Code angesprochene Override beim Destruktor! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz