Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   StringList weiter reichen zur Eigentliche Klasse (https://www.delphipraxis.net/102542-stringlist-weiter-reichen-zur-eigentliche-klasse.html)

Muetze1 31. Okt 2007 16:39

Re: StringList weiter reichen zur Eigentliche Klasse
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, habe das ganze getestet und klappt alles einwandfrei. Ich habe das komplette (Delphi) Projekt angehangen. Die Konsolenanwendung sollte sich leicht zu Lazarus umsetzen lassen. Zur Not kann ich das sonst auch noch machen.

Ich habe B'n'D noch mal schnell aus den M3U extendend info Einträgen die Spielzeit mit ausgelesen und gebe diese mit aus. Die Ausgabe des Programmes ist doppelt. Einmal die Ausgabe von deiner Laderoutine und einmal die von der Main Procedure im Projectfile (diese ist dann mit Spieldauer).

Die M3U muss als Parameter mitgegeben werden.

mimi 31. Okt 2007 16:58

Re: StringList weiter reichen zur Eigentliche Klasse
 
Zitat:

Ok, das widerspricht ja nicht meiner Anpassung, schliesslich kann der Manager schauen ob sein Aufruf mit '' war und entsprechend den internen Filename weiterreichen zu der Playlist Instanz.
Naja, ich wollte schon eine gewisse Freiheit haben, wenn man die Methode benutzt.

Zitat:

Aber zu deinem Problem: Du rufst InitPlaylist() o.ä. im Manager auch vor dem Speichern auf. Dadurch legst du eine neue Instanz an. Rufst du vllt. das Speichern auf?
Ja, weil ich auch die Möglichkeit haben wollte eine m3u Datei in eine pls Datei umzuwandeln.
und das geht meiner meinung nach nur so.

Ich habe mir in deinem Beispiel Projekt die dpr angeschaut, aber so habe ich mir das eigentlich nicht vorgestellt:
Delphi-Quellcode:
 lList := TStringList.Create;

  try



    PLM := TPlaylistenManger.Create;

    try

      PLM.PlaylistItems := lList;



      PLM.LoadFromFile(ParamStr(1));



    finally

      PLM.Free;

    end;
warum gibst du hier PLM wieder frei ? Ich möchte ihn ja später noch verwenden.
Trotzdem, vielen Dank für deine Hilfe.

Wie könnte ich mein Problem noch beschreiben, damit du es verstehst ?

Also nochmal:
Ich erstelle in meine From1.pas eine Variable von Typ TPlaylistenManger und die heißt PlayListeManger.

Beim erstellen von From1 also im OnCreate Event. verknüpfe ich die TStrings von ListBox1.items mit
"PlayListeManger.PlaylistItems" das das sie gleich sind.

Beim Laden wieder hole ich das im Prinzip wieder:
Dort verknüpfe ich bei der Angebenden Playliste.
Wenn ich jetzt bei TPlayListM3U auf PlaylistItems zugreife müsste ich doch jetzt eigentlich die Listbox1.Items ansprechen, oder nicht ?

und genau hier kommt es zu einem Fehler. Aber ich weiß nicht wo.

Ich könnte es nur mit einem Event lösen. Aber das finde ich blöd.. weil das mehr Aufwand bedeuten würde.

Edit: Wenn ich jetzt intern von einer anderen Procedure aus auf "PlayListeManger.PlayListItems
zugreife ist diese einfach leer. Die Listbox ist aber gefüllt. Sollte die "Verbindung" aufgehoben wurden sein ?

mimi 31. Okt 2007 17:04

Re: StringList weiter reichen zur Eigentliche Klasse
 
Das Seltsamme ist, so wird die richtige anzahl ausgeben.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  PlayListeManger:=TPlaylistenManger.Create;
  PlayListeManger.PlayListItems:=ListBox1.Items;
  PlayListeManger.LoadFromFile('/media/hda7/Daten/music/entspannung.m3u');
  writeln(PlayListeManger.PlaylistItems.Count);
end;

// So aber nicht wird nur 0 Ausgeben.
procedure TForm1.SpeedButton5Click(Sender: TObject);
begin
  writeln(PlayListeManger.PlaylistItems.Count);
end;
Die Listbox ist aber gefüllt.

Muetze1 31. Okt 2007 17:45

Re: StringList weiter reichen zur Eigentliche Klasse
 
Zitat:

Zitat von mimi
Ja, weil ich auch die Möglichkeit haben wollte eine m3u Datei in eine pls Datei umzuwandeln.
und das geht meiner meinung nach nur so.

Aber damit überschreibst du dir die in fPlaylist vorhandene Instanz. Diese geht verloren (existiert immernoch, nur du kannst nirgendwo mehr drauf zugreifen). Die neue Instanz ist dann wieder komplett ohne Infos, Einstellungen, etc.

Und es geht noch anders. Du kannst dir, um in einem anderen Playlistenformat zu exportieren, dir einfach in der Playlisten-Basisklasse eine Methode bauen, welche die Titelinformationen aus einer anderen Playlisten-Basisklasse übernimmt. Somit sieht dein Export im Playlistenmanager so aus: (Pseudocode):

Code:
Export(AFileName, AType)
var
  lExportPlaylist: TBasePLaylist;
begin
  lExportPlaylist := CreatePlaylist(AType);
  try
    lExportPlaylist.ÜbernehmeTitel( fPlaylist );

    lExportPlaylist.SaveToFile( AFilename );
  finally
    lExportPlaylist.Free;
  end;
end;
Zitat:

Zitat von mimi
warum gibst du hier PLM wieder frei ? Ich möchte ihn ja später noch verwenden.

Das ist die Hauptprocedure des Programmes. Dort erstelle ich den PLM, nutze ihn (in dem ich die Playlist lade & ausgebe) und danach gebe ich ihn wieder frei, da am Ende dieser Procedure auch das Programm zu Ende ist. Dabei ist es doch völligst unerheblich wie du das implementieren möchtest. Du kannst doch genauso das anlegen des PLM im OnCreate machen, das Laden im OnClick und das freigeben im OnDestroy. Wo sollte dort der Unterschied liegen?

Zitat:

Zitat von mimi
Dort verknüpfe ich bei der Angebenden Playliste.

Der PLM hat dann schon die angebene Instanz von der Listbox. Warum reicht er diese nicht einfach nur weiter an die Playlistinstanz die er selber anlegt?

Zitat:

Zitat von mimi
Wenn ich jetzt bei TPlayListM3U auf PlaylistItems zugreife müsste ich doch jetzt eigentlich die Listbox1.Items ansprechen, oder nicht ?

Ja, so lange es immernoch die selbe/gleiche Instanz ist. Wenn du zwischendurch (also zwischen der ersten Zuweisung des TStrings Objektes und dem jetzigen Zugriff z.B. wieder InitPlaylist() aufrufst, dann ist es eine andere Instanz - und die hat dann nicht mehr die TStrings Instanz sondern nil. Da es eine komplett andere Instanz ist.

Zitat:

Zitat von mimi
und genau hier kommt es zu einem Fehler. Aber ich weiß nicht wo.

Debuggen! Der Debugger von Lazarus ist sehr gut nutzbar und hilfreich. Auch ein Breakpoint in der SetPlaylistItems des PLM etc würde vllt. zu mehr Erkenntnissen führen, weil dieser vllt. öfters und vllt. mit anderen Instanzen aufgerufen wird.

Zitat:

Zitat von mimi
Die Listbox ist aber gefüllt.

Dann hast du immernoch irgendwo ein unnötige TStringList.Create drin und/oder weist der TPLaylistM3U Instanz eine andere Instanz zu, als die, welcher der PDM in fPlaylistItems hat.

mimi 31. Okt 2007 18:36

Re: StringList weiter reichen zur Eigentliche Klasse
 
um umwandeln: Nein, dein code ist mir zu aufwendig.
da gebe ich lieber Playliste beim Speichern einfach wieder frei, wenn es belegt.

Ich habe den Code mehrfach geprüft und konnte keinen Fehler Feststellen.

Naja, evlt. finde ich den Fehler noch.

mimi 31. Okt 2007 18:47

Re: StringList weiter reichen zur Eigentliche Klasse
 
Wenn ich das was ich bei onCreate im From1 drin stehen habe, in einem Button Verschiebe und klicke dann geht das alles wie ich es mir Vorgestellt habe.

Aber wie kann das angehen ?

mimi 31. Okt 2007 18:52

Re: StringList weiter reichen zur Eigentliche Klasse
 
Wenn ich das so habe, wird das Memo gefüllt:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  PlayListeManger:=TPlaylistenManger.Create;
  PlayListeManger.PlayListItems:=ListBox1.Items;
end;
und nicht die Listbox. Ich denke das es sich hierbei um einen Lazarus BUG handeln muss.

Ich glaube ich sollte die Frage noch mal im Lazarus-Forum stellen.

Vielen Dank, für deine Mühevolle Hilfe.

Muetze1 31. Okt 2007 19:01

Re: StringList weiter reichen zur Eigentliche Klasse
 
1. Es gibt da oben rechts bei deinen Einträgen einen recht nützlichen "EDIT" Button.

2.
Zitat:

Zitat von mimi
um umwandeln: Nein, dein code ist mir zu aufwendig.

Was ist daran aufwendig? Vor allem ist es OOP!

3.
Zitat:

Zitat von mimi
Wenn ich das so habe, wird das Memo gefüllt und nicht die Listbox. Ich denke das es sich hierbei um einen Lazarus BUG handeln muss.

Es ist definitv kein BUG von Lazarus sondern recht eindeutig ein Bug von dir. Du weist irgendwo der Instanz die Items auf die Lines Eigenschaft des Memos selber zu. Lazarus denkt sich das nicht aus und es mehr ein fast unmöglicher Zufall, dass es die Lines Eigenschaft des Memos anstatt der Listbox ist. Und ich glaube nicht an Zufälle - und ich kann dir versichern, dass dies auch keiner ist.

mimi 1. Nov 2007 11:23

Re: StringList weiter reichen zur Eigentliche Klasse
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Du weist irgendwo der Instanz die Items auf die Lines Eigenschaft des Memos selber zu
Nein das tue ich mit 100%iger Sicherheit nirgends, warum auch ?

Da du dich anscheind mit Lazarus auskennst, habe ich mal das gesammte Projekt Angehangen

ich glaube ja auch das es mein Fehler ist, aber so langsam glaube ich das liegt gar nicht an mir. Nach dem was ich gestern gesehen habe. Ich verwende Memo1 nur einmal und das ist beim Klicken. auf die Listbox.

zu1: ist mir bekannt.....

edit:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  PlayListeManger:=TPlaylistenManger.Create;
  PlayListeManger.PlayListItems:=Memo1.Lines;
end;
Wenn ich das Memo1 direkt zuweise, hängt sich das Programm beim ausführen auf.
Ich vermute es liegt ein Pointer Problem vor, was direkt oder indirekt mit Lazarus zu tun hat.
Evlt. werde ich es mal unter Delphi testet, wie es sich dort verhält. Wenn es da klappt, dann ist es doch beweisen, das es ein Lazarus Problem ist oder ?

Muetze1 1. Nov 2007 11:53

Re: StringList weiter reichen zur Eigentliche Klasse
 
Zitat:

Zitat von mimi
Zitat:

Zitat von Muetze1
Du weist irgendwo der Instanz die Items auf die Lines Eigenschaft des Memos selber zu

Nein das tue ich mit 100%iger Sicherheit nirgends, warum auch ?

Aber genau in dem von dir geposteten Quellcode weist doch der PlaylistenManager-Eigenschaft Memo1.Lines (wie ich es sagte) zu, und genau diese Eigenschaft weist du doch den PlaylistItems der TBasePlaylist zu. Somit nutzt er das Memo1. Vollkommen logisch und wie ich behauptet hatte.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  PlayListeManger:=TPlaylistenManger.Create;
  PlayListeManger.PlayListItems:=Memo1.Lines;  // <<< Ich denke du willst ListBox.Items und nicht Memo1.Lines
                                                // genau davon habe ich geredet...
end;
Zitat:

Zitat von mimi
Wenn ich das Memo1 direkt zuweise, hängt sich das Programm beim ausführen auf.

Diese Zuweisung sollte der Compiler nichtmal akzeptieren ohne harten Typecast, da du schliesslich nicht kompatible Typen zuweisen willst. Und das es abstürzt ist mehr als logisch, schliesslich ist ein TStrings-Derivat was anderes als ein TMemo.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:54 Uhr.
Seite 3 von 4     123 4      

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