![]() |
TstringList // Form2 daten aus einer anderen Klasse lesen
Hi LEute !
Folgendes Problem beschäftigt mich schon eine Weile. Ich habe eine MainForm, eine Playlist_Klasse, und eine Form2. In der Playlist_Klasse ist die TStringList. Die wird aus der MainForm gefüttert. Also adden, counten etc funzt alles super. Jetzt wird die Form2 aus der MainForm angezeigt.
Delphi-Quellcode:
Wenn ich jetzt versuche aus der Form2 auf die Playlist_Klasse zu lesen geht nix.
Form2.Show;
Ich habe es testhalber mit einen einfachem count versucht.
Delphi-Quellcode:
Er gibt mir aber immer null zurück. Ich checke das nicht. Bitte um Hilfe.unit window_playlist; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,Playlist_s0n_Klasse; type TForm2 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; swPlaylist: Ts0nPlaylist; implementation {$R *.dfm} procedure TForm2.FormCreate(Sender: TObject); begin swPlaylist := Ts0nPlaylist.Create; end; procedure TForm2.FormClick(Sender: TObject); var test: integer ; begin test:=swPlaylist.GetCount; showMessage(inttostr(test)); <---- da gibt er immer 0 zurück end; end. mfg s0n |
Re: TstringList // Form2 daten aus einer anderen Klasse lese
Du arbeitest auch mit 2 verschiedenen Instanzen der Klasse
|
Re: TstringList // Form2 daten aus einer anderen Klasse lese
Ich schimpfe mich selber als Anfänger. Könntest du mir das bitte erklären wie ich es richtig programmieren sollte ?
|
Re: TstringList // Form2 daten aus einer anderen Klasse lese
Moin,
wir vermuten, dass du in Form1 ebenfalls eine Instanz von Ts0nPlaylist erstellst. Da du das gleiche in Form2 noch einmal machst, hast du 2 Instanzen der Klasse erzeugt. Jede Klasse führt natürlich die eigenen Daten, daher kennt die 2te Instanz nicht der Daten der Ersten. Lösungen gibt es mehrere - man könnte z.B. die Klasse Ts0nPlaylist sich selbst erzeugen lassen (im initialization-Abschnitt der Unit) dann können alle auf diese zentrale Instanz zugreifen. |
Re: TstringList // Form2 daten aus einer anderen Klasse lese
Moin moin,
Deine Playlist aus Form1 hat vielleicht den gleichen Namen, ist aber nicht die Gleiche. Mit "swPlaylist := Ts0nPlaylist.Create; " generierst Du nur an anderer Stelle eine Playlist, die geuso heisst, wie die ind Form1. wenn Du in Form1:
Delphi-Quellcode:
vor dem implementation Teil einfügst und in der "unit window_playlist;" im uses Teil Form1 einfügst, kannst du
var
Form1: TForm1; swPlaylist: Ts0nPlaylist;
Delphi-Quellcode:
Gruss
procedure TForm2.FormClick(Sender: TObject);
var test: integer ; begin test:=Form1.swPlaylist.GetCount; showMessage(inttostr(test)); <---- dass gibt dann den gewünschten Wert zurück end; Michael |
Re: TstringList // Form2 daten aus einer anderen Klasse lese
.. und hat damit eine zirkuläre Referenz, nicht besonders schön
|
Re: TstringList // Form2 daten aus einer anderen Klasse lese
Zitat:
Könntest du mir bitte ein kleines Beispiel zeigen wie die Klasse sich selbst erzeugt? Ich verstehe das jetzt ehrlich gesagt nicht so wirklich. Und wie greife ich dann auf diese Instanz zu. Genauso wie bisher ? mfg s0n |
Re: TstringList // Form2 daten aus einer anderen Klasse lese
sehr schematisch:
Delphi-Quellcode:
Alle Formulare etc. die die Unit "PlaylistKlasse" einbinden, können die von dieser Klasse veröffentlichten Methoden etc. nun nutzen. Aufruf z.B. mit Playlist.Count
Unit PlaylistKlasse;
interface type tPlaylist ... public function Count:Integer; end; var Playlist : tPlaylist implementation ... initialization Playlist:=tPlaylist.Create(nil); finalization FreeAndNil(Playlist); end. |
Re: TstringList // Form2 daten aus einer anderen Klasse lese
Also ich habe jetzt in der Playlist Klasse folgendes geschrieben
Delphi-Quellcode:
Wobei ich die initial.... auch diret in create schreiben könnte ( denke ich mal )var Playlist: Ts0nPlaylist; implementation constructor Ts0nplaylist.Create; begin inherited create; scPlayList := THashedStringList.Create; scActTrackIndex:= 0; end; destructor Ts0nplaylist.Destroy; begin scPlaylist.Free; inherited destroy; end; // eine menge Prozeduren und funktionen initialization Playlist := Ts0nPlaylist.Create; finalization FreeAndNil (Playlist); end. Ich habe es probiert so zu schreiben:
Delphi-Quellcode:
Da sagt er mir aber das ich zu viele PArameter angegeben habe.Ohne Nil nimmt er es an.initialization Playlist := Ts0nPlaylist.Create(Nil); So nun aber zum eigentlichen. Es funzt irgendwie nicht. Ich kann aus der Form2 Unit alle propertys oder proceduren verwenden. Aber nicht aus der Mainform obwohl in Uses mit angewählt. DAs heißt, ich kann immernoch nicht von der Main FOrm und von Form2 auf die Playlist_Klasse zu greifen. |
Re: TstringList // Form2 daten aus einer anderen Klasse lese
Hallo,
hat das jetzt noch mit der PlayList zu tun ? Wenn nicht, bitte neuen Thread aufmachen. Heiko |
Re: TstringList // Form2 daten aus einer anderen Klasse lese
JA hat es. Denn ich kann immernoch nicht von 2 Forms auf meine PlaylistKlasse zu greifen. LEIDER :(
mfg s0n |
Re: TstringList // Form2 daten aus einer anderen Klasse lese
Juhu ich habe es. Danke LEute. Die Idee war richtig. DAnke taaktaak.
Ich habe jetzt von der Main Form es so aufgerufen Player_s0n_Klasse.playlist.GetCount; Thx. Endlich kann ich weiter machen mfg s0n |
Re: TstringList // Form2 daten aus einer anderen Klasse lese
Die Unit beim Zugriff mit anzugeben ist nur notwendig, wenn es irgendwo noch eine weitere Variable gibt, die Playlist heist.
Das Chaos ist vorprogrammiert. Entweder eine der Variable entsorgen oder einen anderen Namen vergeben. |
Re: TstringList // Form2 daten aus einer anderen Klasse lese
@Blub. Ich habe jetzt extra nochmal geschaut. ICh finde in meiner MainForm keine weitere Variable mit der Bezeichnung Playlist .
Ich habe mal die Main Unit . Playlist_Klasse , und dir Form2 Unit hier aufgelstet Main Unit
Delphi-Quellcode:
Playlist_Klasse
unit Player_V0_2;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Menus, playlist_s0n_Klasse, player_s0n_Klasse, ExtCtrls ; type TForm1 = class(TForm) Button_Play: TButton; Button_previous: TButton; Button_stop: TButton; Button_next: TButton; MainMenu1: TMainMenu; N1: TMenuItem; Open: TMenuItem; Open_Folder: TMenuItem; Save_Playlist: TMenuItem; Process: TMenuItem; Stop1: TMenuItem; Previous: TMenuItem; Next: TMenuItem; View1: TMenuItem; Playlist: TMenuItem; FileOpenDialog: TOpenDialog; Timer_Ablauf: TTimer; Namefield: TPanel; Timefield: TPanel; CpuField: TPanel; ScrollBar_Volume: TScrollBar; Label_Volume: TLabel; Id3TagInfo1: TMenuItem; ScrollBar_Position: TScrollBar; N2: TMenuItem; Info1: TMenuItem; procedure FormCreate(Sender: TObject); procedure OpenClick(Sender: TObject); procedure Timer_AblaufTimer(Sender: TObject); procedure ScrollBar_VolumeChange(Sender: TObject); procedure ScrollBar_PositionScroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); procedure PlaylistClick(Sender: TObject); procedure Button_nextClick(Sender: TObject); procedure Button_previousClick(Sender: TObject); procedure Info1Click(Sender: TObject); procedure Button_PlayClick(Sender: TObject); procedure Button_stopClick(Sender: TObject); procedure FormClick(Sender: TObject); private { Private-Deklarationen } public end; var Form1: TForm1; sPlayer: Ts0nPlayer; posScroll: longword; ScrollMAx: integer; Const BASS_ACTIVE_STOPPED = 0; BASS_ACTIVE_PLAYING = 1; BASS_ACTIVE_STALLED = 2; BASS_ACTIVE_PAUSED = 3; implementation uses window_playlist; {$R *.dfm} //************************************************************* //Beim Starten des Hauptfensters wird diese Procedur ausgeführt //************************************************************* procedure TForm1.FormCreate(Sender: TObject); var tempL: real; begin // Objekte erstellen sPlayer := ts0nplayer.Create; // Bass Engine initialisieren sPlayer.BassEngineInit(handle); // Anfangs Lautstärke auf 30 % setzen tempL:=30; sPlayer.Lauststaerke(tempL); // ScrollBar für Volume setzen scrollbar_Volume.Position := Round(tempL); end; //************************************************************* // Action nach Open Klick //************************************************************* procedure TForm1.OpenClick(Sender: TObject); var sadded: string; i : integer; begin // Eigenschaften des Open Dialog setzen FileOpenDialog.Title:='Open Files ...'; FileOpenDialog.Filter:='MP3 Dateien|*.mp3|Wave Dateien|*.wav'; if FileOpenDialog.Execute then for i := 0 to FileOpenDialog.Files.Count - 1 do begin sAdded:= FileOpenDialog.Files[i] ; // sPlaylist.AddTrack(sAdded); playlist_s0n_Klasse.Playlist.AddTrack(sadded); end; end; //************************************************************* // Tímer //************************************************************* procedure TForm1.Timer_AblaufTimer(Sender: TObject); var temp: integer; temp2: string; begin Timer_Ablauf.Interval:=100; CpuField.Caption:= 'CPU: ' + sPlayer.GetCpuStatus + '%'; // Wenn die interne Playlist keine Traxx enthält dann werden die Buttons gesperrt if playlist_s0n_Klasse.Playlist.Getcount > 0 then begin Button_Play.Enabled := true; Button_previous.Enabled := true; Button_Next.Enabled := true; Button_Stop.Enabled := true; end else begin Button_Play.Enabled := false; Button_previous.Enabled := false; Button_Next.Enabled := false; Button_Stop.Enabled := false; end; // Wenn Wiedergabe gestartet wird der Position Regler freigegeben und die Zeiten aktualisiert if splayer.GetBassStatus = BASS_ACTIVE_PLAYING then begin ScrollBar_Position.Enabled := true ; temp:= Round( sPlayer.GetTrackTimeRunSec / sPlayer.GetTrackTimeLoadSec * 1000); if ScrollBar_Position.Tag = 0 then ScrollBar_Position.Position:= temp; Namefield.Caption:=extractfilename(playlist_s0n_Klasse.Playlist.ActTrackName); TimeField.Caption:= sPlayer.GetActualTime + '/' + splayer.GetTrackTimeRun; end; if Scrollbar_Position.Position = 1000 then begin temp2:= playlist_s0n_Klasse.Playlist.GetNextTrackName; sPlayer.Abspielen(temp2); end; end; //************************************************************* // Volume Scroller //************************************************************* procedure TForm1.ScrollBar_VolumeChange(Sender: TObject); var tempScroll: real; begin tempScroll:=ScrollBar_Volume.Position / 100; sPlayer.Lauststaerke(tempScroll); Label_Volume.Caption:=(FloatToStr(tempScroll*100)) + ' %'; end; //Button Play procedure TForm1.Button_PlayClick(Sender: TObject); begin playlist_s0n_Klasse.Playlist.PlayActTrack; end; //Button Next Track procedure TForm1.Button_nextClick(Sender: TObject); begin playlist_s0n_Klasse.Playlist.PlayNextTrack; end; //Button Previous Track procedure TForm1.Button_previousClick(Sender: TObject); begin playlist_s0n_Klasse.Playlist.PlayPreviousTrack; end; //Button Stop procedure TForm1.Button_stopClick(Sender: TObject); begin playlist_s0n_Klasse.Playlist.StopActTrack; ScrollBar_Position.Position:=0; end; //ScrollBar Action nach beenden des Scrollens procedure TForm1.ScrollBar_PositionScroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); begin if Scrollcode = scEndScroll then begin ScrollMax:=ScrollBar_Position.Max; posScroll:= ScrollBar_Position.Position; sPlayer.SetPosition(posScroll,ScrollMax); ScrollBar_Position.Tag:=0; end else ScrollBar_Position.Tag:=1; end; // Menu Einträge die angelkickt werden //Menu View - Show - Anzeigen des Playlist Fensters procedure TForm1.PlaylistClick(Sender: TObject); begin Form2.Show; end; // Menu ? - Info procedure TForm1.Info1Click(Sender: TObject); begin ShowMessage('programmed by s0n: Version 0.2'); end; procedure TForm1.FormClick(Sender: TObject); begin showMessage(inttostr(playlist_s0n_Klasse.Playlist.Getcount)); end; end.
Delphi-Quellcode:
Form2 Unit
unit playlist_s0n_Klasse;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Bass, StdCtrls, ComCtrls, IniFiles, player_s0n_klasse; type Ts0nplaylist = class scPlayList: THashedStringList ; // In dieser Liste werden die Namen der Traxx gespeichert scActTrackIndex: Integer; // Variable für den aktuellen TrackIndex sPlayer: Ts0nPlayer; // Player Klassenverknüpfung setzen constructor Create; destructor Destroy; override; private public procedure AddTrack(var scFile: String); // Fügt einen Track zu der String List function GetNextTrackIndex: Integer; // Ermittelt die nächste Track Indexnummer function GetNextTrackName: String; // Ermittel den nächsten Tracknamen ( benötigt die nächste Indexnummer ) function GetPreviousTrackIndex: Integer; // Ermittelt die vorherige Track Indexnummer function GetPreviousTrackName: String; // Ermittelt den vorherigen Tracknamen function Getcount: integer; // Gesamtanzahl der Einträge in der StringList function ActTrackName: String; // Gibt den Eintrag aus der per Index augerufen wurde procedure PlayActTrack; // aktuellen Track abspielen procedure PlayNextTrack; // nächsten Track abspielen procedure PlayPreviousTrack; // vorherigen Track abspielen procedure StopActTrack; // stoppt den aktuell laufen Track end; var Playlist: Ts0nPlaylist; implementation constructor Ts0nplaylist.Create; begin inherited create; Playlist := Ts0nPlaylist.Create; scPlayList := THashedStringList.Create; scActTrackIndex:= 0; end; destructor Ts0nplaylist.Destroy; begin scPlaylist.Free; FreeAndNil (Playlist); inherited destroy; end; //*********************************************************** // Adden //*********************************************************** procedure ts0nplaylist.AddTrack(var scFile: String); begin scPlayList.Add(SCFile); end; //*********************************************************** // Den aktuellen Tracknamen auslesen //*********************************************************** function Ts0nPlaylist.ActTrackName: String; begin result:=scPlaylist.Strings[scActTrackIndex]; end; //*********************************************************** // Die nächste List Indexnummer auslesen //*********************************************************** function ts0nplaylist.GetNextTrackIndex: Integer; begin if scActTrackIndex = scPlaylist.Count-1 then begin scActTrackIndex := 0; end else begin scActTrackIndex := scActTrackIndex + 1; end; result:=scActTrackIndex; end; //*********************************************************** // Die vorherige List Indexnummer auslesen //*********************************************************** function ts0nplaylist.GetPreviousTrackIndex: Integer; begin if scActTrackIndex = 0 then begin scActTrackIndex := scPlaylist.Count-1; end else begin scActTrackIndex := scActTrackIndex -1 ; end; result:=scActTrackIndex; end; //*********************************************************** // Den nächsten Track Name auslesen //*********************************************************** function ts0nplaylist.GetNextTrackName: String; begin result:= scPlaylist.Strings[GetNextTrackIndex]; end; //*********************************************************** // Den vorherigen Track Name auslesen //*********************************************************** function ts0nplaylist.GetPreviousTrackName: String; begin result:= scPlaylist.Strings[GetPreviousTrackIndex]; end; //*********************************************************** // Count ausgeben //*********************************************************** function ts0nplaylist.getcount: integer; begin result:=scPlaylist.Count; end; //*********************************************************** // Den aktuellen Track abspielen //*********************************************************** procedure Ts0nPlaylist.PlayActTrack; var sct: string; begin case sPlayer.BassStatus of BASS_ACTIVE_STOPPED: begin sct:=ActTrackName; sPlayer.Abspielen(sct); end; BASS_ACTIVE_PLAYING: sPlayer.Pausieren; BASS_ACTIVE_PAUSED: sPlayer.Fortsetzen; end; end; //*********************************************************** // Den nächsten Track abspielen //*********************************************************** procedure Ts0nPlaylist.PlayNextTrack; var sct: string; begin sct:= GetNextTrackName; sPlayer.Abspielen(sct); end; //*********************************************************** // Den vorherigen Track abspielen //*********************************************************** procedure Ts0nPlaylist.PlayPreviousTrack; var sct: string; begin sct:= GetPreviousTrackName; sPlayer.Abspielen(sct); end; //*********************************************************** // Den aktuellen Track stoppen //*********************************************************** procedure Ts0nPlaylist.StopActTrack; begin sPlayer.Stoppen; end; end.
Delphi-Quellcode:
Ich hoffe das war jetzt nicht zu viel.Was muß ich in der Main Unit ändern damit ich dieses Chaos beseitigen kann.
unit window_playlist;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,playlist_s0n_Klasse, player_s0n_Klasse, ComCtrls; type TForm2 = class(TForm) MainPlayList: TListView; procedure FormActivate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.FormActivate(Sender: TObject); var myList : TListItem; begin myList := MainPlayList.Items.Add; myList.Caption:=Playlist.ActTrackName; end; end. mfg s0n |
Re: TstringList // Form2 daten aus einer anderen Klasse lese
Hallo,
1.
Delphi-Quellcode:
Bis auf Form1 sind das alles globale Variablen,
var
Form1: TForm1; sPlayer: Ts0nPlayer; posScroll: longword; ScrollMAx: integer; die hier nichts zu suchen haben. Sie kommen in den private-Teile von TForm1. Bei sPlayer steht wieder die Frage, ob er auch von anderen Units/Forms benutzt wird, wenn ja, die hast ja jetzt eine eigene Klasse dafür. 2.
Delphi-Quellcode:
Das kommt in die eigene Klasse.
Const
BASS_ACTIVE_STOPPED = 0; BASS_ACTIVE_PLAYING = 1; BASS_ACTIVE_STALLED = 2; BASS_ACTIVE_PAUSED = 3; 3. Der Schreibstil !!! ;)
Delphi-Quellcode:
Einmal eingerückt, dann wie der nicht
//Button Play
procedure TForm1.Button_PlayClick(Sender: TObject); begin playlist_s0n_Klasse.Playlist.PlayActTrack; end; //Button Next Track procedure TForm1.Button_nextClick(Sender: TObject); begin playlist_s0n_Klasse.Playlist.PlayNextTrack; end;
Delphi-Quellcode:
begin
Code end begin Code end Das ist total unleserlich. Erwarte nicht, dass sich das jemand komplett ansieht Augenkrebs !!! ;) Noch ein Bsp.
Delphi-Quellcode:
Ober das begin/end des else noch eingerückt werdne sollte,
if Bedingung then
begin Code1 end else begin Code2 end; Ansichtssache ... Heiko |
Re: TstringList // Form2 daten aus einer anderen Klasse lese
Danke für die konstruktive Kritik. Werde ich mir zu Herzen. Nehmen. Wie gesagt ich programmiere jetzt erst 2 Wochen. :oops:
Aber ich bin immer offen für Tipps. Es währe super wenn Delphi es selber einrücken würde. Das Problem bei diesem Stück ist
Delphi-Quellcode:
mache ich es nicht, muß ich die Bass Unit mit in die uses schreiben. Weiß halt leider ob das wieder Speicher kostet ( wobei das bei meinen vielen Fehlern soweiso egal ist :) )
Const
BASS_ACTIVE_STOPPED = 0; BASS_ACTIVE_PLAYING = 1; BASS_ACTIVE_STALLED = 2; BASS_ACTIVE_PAUSED = 3; Die sPlayer Variable werde ich jetzt auch rausschreiben. Da dies genau dasselbe Problem ist wie mit der Playlist Klasse. Ich merke schon, es liegt ein langer Weg vor mir:) ... Wie sieht denn der, sagen wir mal "leserlichste Schreibstil" aus? Will ja nicht doch dem Augenarzt neue Kundschaft bescheeren :) . @Blub Danke dafür. Schon umgesetzt. Und siehe da es funzt. Man wenn alles so einfach gehen würde. Super von euch... Danke für eure hilfe mfg s0n |
Re: TstringList // Form2 daten aus einer anderen Klasse lese
Hallo,
2 Wochen, OK, Entschuldigung angenommen. Schau dir einfach mal die Standard-Units von Delphi an, um den Stil zu erlernen (Strg + linke Maustaste auf die Unit). Oder suche im Programme\Borland nach Pas-Dateien. Zitat:
Beim uses wird nur das in die Exe reinkompiliert, was auch benutzt wird (der Linker schmeisst den Rest raus) Und ausserdem: Wie gross war noch mal deine Festplatte, 20 oder 30 MB ? Ich habe ne 170er ätsch ;) Im Ernst, zum Anfang brauchst du dir um Exe-Grösse keine Sorgen machen. Heiko |
Re: TstringList // Form2 daten aus einer anderen Klasse lese
@ hoika Danke
Okay dann nehme ich den einfachen Weg :) und nehme die Bass mit in die uses auf. mfg s0n |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:10 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