Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Klassen verknüpfen?


Delete - Fr 11.07.08 21:56
Titel: Klassen verknüpfen?
Moin! :D
ich habe ein Problem.Und zwar mit zwei klassen. Beispiel:
ich erstelle zwei klassen und in der einen procedure der zweiten klasse rufe ich die andere auf.
aber jetzt gibs ne zugriffsverletzung.
Was muss ich machen? :roll:


Christian S. - Fr 11.07.08 21:58

Nicht so viel Informationen, das kann doch keiner durchlesen! Diese riesen Mengen an Quellcode schon gar nicht! :shock:


...


Meine Glaskugel sagt mir, dass Du vorher noch irgendwo eine Instanz einer Klasse erzeugen musst.


Jerk - Fr 11.07.08 22:22

Vorher initialisieren?


Delete - Fr 11.07.08 23:15

Zitat:
Meine Glaskugel sagt mir, dass Du vorher noch irgendwo eine Instanz einer Klasse erzeugen musst.
Dann frage bitte deine göaskugel wie das geht. :wink:


Christian S. - Fr 11.07.08 23:21

Wie wäre es, wenn Du erst einmal mehr Informationen lieferst, damit man weiß, ob das überhaupt der Fehler ist? Ich mach mir doch jetzt nicht die Mühe, um hinterher veilleicht festzustellen, dass das gar nicht der Fehler ist.

Dass Du nach meinem überdeutlichen Hinweis keine Informationen nachlieferst, ist schon ziemlich unverschämt! :evil:


Delete - Sa 12.07.08 10:20


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
  type
    TAudioFile = class
    private
        fInterpret: String;
        fTitel    : String;
        fPfad     : String;
        fDauer    : Integer;

        procedure GetMp3Info;
        procedure GetWmaInfo;
        procedure SetUnknown;

        function GetPlaylistTitel: String;

    public
        property Interpret: String read fInterpret write fInterpret;
        property Titel    : String read fTitel     write fTitel;
        property Pfad     : String read fPfad;
        property Dauer    : Integer read fDauer write fDauer;
        property PlaylistTitel: String read GetPlaylistTitel;

        constructor Create;
        destructor Destroy; override;

        procedure GetAudioInfo(filename: String);
        procedure Assign(aAudioFile: TAudioFile);
    end;
TMeMPPlayer = class
private
 fMainStream: DWord;
fMainVolume: single;
fMainAudioFile: TAudioFile;
function MeMP_CreateStream(aFilename: String): DWord;
procedure SetVolume(Value: single);
function GetTime: Double;
function GetProgress: Double;
procedure SetProgress(Value: Double);
function GetBassStatus: DWord;
public
property Volume: single read fMainVolume write SetVolume;
property Time: Double read GetTime;
property Progress: Double read GetProgress write SetProgress;
property BassStatus: DWord read GetBassStatus;
constructor Create;
procedure SetPosition(Value: Longword);
destructor Destroy; override;
procedure InitBassEngine(HND: HWND);
procedure Play(aAudioFile: TAudioFile);
procedure Pause;
procedure Stop;
procedure Resume;
procedure StopAndFree;
end;
implementation

procedure TMeMPPlayer.Play(aAudioFile: TAudioFile);
begin
if aAudioFile <> NIL then
begin
fMainAudioFile.Assign(aAudioFile);
StopAndFree;
fMainstream := MeMP_CreateStream(fMainAudioFile.Pfad);
BASS_ChannelSetAttribute(fMainStream, BASS_ATTRIB_VOL, fMainVolume);
BASS_ChannelPlay(fMainStream , True);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin

globalaudiofile:= TAUDIOfile.create;
MEMPPLAYER:=TMEMPpLAYER.create;
  MeMPPlayer.InitBassEngine(Handle);
MeMPPlayer.Volume := 1;
end;


Also hier ist der gewünschte quelltext.


Delete - Sa 12.07.08 10:24

Ach und entschuldigung. :cry: :cry: :cry:
Der fehler kenne ich ja schon wie gesagt sobald ich in der einen procedure der klasse memp
die klasse taudiofile aufrufe kommt eine zugriffsverletzung. :cry: :cry: :cry:
Ach der quelltext kommt euch bestimmt bekannt vor.ist aus gausis tut. :wink:


Gausi - Sa 12.07.08 11:18

Ich habe jetzt noch nicht verstanden, wo da jetzt die Zugriffsverletzung kommt. :gruebel:


Delete - Sa 12.07.08 11:19


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
case MeMPPlayer.BassStatus of
BASS_ACTIVE_STOPPED:
begin
MeMPPlayer.Play(GlobalAudioFile);//Genau hier
//LblTitel.Caption := GlobalAudioFile.PlaylistTitel;
end;
BASS_ACTIVE_PLAYING: MeMPPlayer.Pause;
BASS_ACTIVE_PAUSED : MeMPPlayer.Resume;
end;
end;


mkinzler - Sa 12.07.08 11:29

Existiert den eine Instanz von TAudioFile?


Delete - Sa 12.07.08 11:32

Was ist eine instanz?


Christian S. - Sa 12.07.08 11:34

Darf ich Dich mal aus diesem [http://www.delphi-library.de/viewtopic.php?p=512612#512612] Thread zitieren ;-)
user profile iconj.klugmann hat folgendes geschrieben:
Dann würde ich erstmal mit einem einführungs buch anfangen.


http://www.christian-stelzmann.de/artikel/crashkurs.htm#objektorientierteprogrammierung


Delete - Sa 12.07.08 11:39

Ach :autsch: :autsch: :autsch: !Ich habs mit den begriffen nicht so. :oops:
Habs kapiert.ja ich habe eine Instanz angelegt. 8)


Gausi - Sa 12.07.08 12:05

Häng mal das ganze Projekt an. Da ist bestimmt irgendwo eine globale Variable lokal (dieses GlobalAudioFile ist im Tutorial nur temporär, das kommt später weg - nur so zur Verteidigung :angel:), oder wird irgendwo freigegeben, sodass der Zeiger zwar <> Nil, aber nicht mehr gültig ist... :nixweiss:


Delete - Sa 12.07.08 12:33

OK hier ist er.

Moderiert von user profile iconChristian S.: 500 Zeilen sind wohl als Anhang besser ...


Gausi - Sa 12.07.08 12:42

Bitte sag nicht, dass dein Code wirklich so ausieht. Das ist ja grausam - ich hoffe mal, dass das durch das Copy&Paste hier gekommen ist. :eyes:

Das einzige, was mir so auffällt, ist das ganze NewInstance-Gedöns. Lass das mal weg, und erzeuge die Objekte so, wie im Tutorial gezeigt.


Delete - Sa 12.07.08 12:48

das war ein versuch nachdem ich an diesem fehler verzweifelt bin.-
was jetzt?


Gausi - Sa 12.07.08 12:51

Ich weiß auch nicht, was du da so machst. Ich habe in meinem ganzen Leben noch nie NewInstance benötigt - kannte das bisher nicht einmal. Und so, wie der Code formatiert ist, und mit den Bezeichnern, guck ich da nicht weiter durch. Das ganze Projekt (also pas, dpr, dfm, etc) könnte ich mal durchgucken, wo der Compiler/Debugger meckert.

Ein paar OOP-Grundlagen wären aber sicherlich nicht verkehrt. ;-)


Delete - Sa 12.07.08 12:59


Delphi-Quelltext
1:
If funzt=true then Juhuuuu! ;                    

Juhuuuuuuuuuu! :D :D :D :D :D :lol:
es funktioniert!Ich muss mir unbedingt angewöhnen meinen code sauber zu schreiben.
ich hab vergessen eine Instanz zu erzeugen:
mempplayer.fMainAudioFile:= TAudioFile.Create; :idea:
bin selber drauf gekommen.da sieht man mal das man lieber seinen code mal ordentlich durchgucken sollte. 8)


Dunkel - Sa 12.07.08 13:04

user profile iconj.klugmann hat folgendes geschrieben:
bin selber drauf gekommen.

Ach ja?

user profile iconChristian S. hat folgendes geschrieben:
Meine Glaskugel sagt mir, dass Du vorher noch irgendwo eine Instanz einer Klasse erzeugen musst.


user profile iconmkinzler hat folgendes geschrieben:
Existiert den eine Instanz von TAudioFile?


user profile iconGausi hat folgendes geschrieben:
Das einzige, was mir so auffällt, ist das ganze NewInstance-Gedöns. Lass das mal weg, und erzeuge die Objekte so, wie im Tutorial gezeigt.


Nachdem Du 3 Mal dezent darauf hingewiesen worden bist, bist Du "alleine" drauf gekommen?! Glückwunsch! :lol: :wink:

Naja, Hauptsache es funktioniert. :D :wink:


Delete - Sa 12.07.08 13:34

ich meine damit das ich selbst den fehler gefunden und behoben habe.