Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Klassen Problem: er finde die funktion nicht.[Gelöst]


mimi - Mi 09.07.03 14:27
Titel: Klassen Problem: er finde die funktion nicht.[Gelöst]
Hallo,
ersteinmal folgenden code habe ich:

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:
unit thredUnit;

interface

uses
  Classes,Dialogs;


type
  Test1 = class(TThread)
  private
    { Private-Deklarationen }
  protected
  public
    procedure Execute; override;
  end;

implementation

uses soundsystem;


procedure Test1.Execute;
var
  t:Integer;
begin
  t:=0;
  while (Not Terminated) and (t=0do  
//   *

end;

end.
type
  TSound = class
    private
      GoFlag:Integer;
      test:Test1;
    protected

    public
      PlayListe: array of TPlayListe;
      Random_Music: array of TPlayListe;
      constructor create(pSoundFiles,SoundDir,DefaultExt:String;flag:Integer); // Lädt die Angebenden Sound Files
      
      procedure NewMusik;
      procedure NewMusik2;
      procedure LoadMusikFile(Index:Integer;RM:Boolean);
      procedure AddPlayListe(FileName:String); // Fügt der Playliste eine Datei hinzu
      procedure PlayMusikFile(Index:Integer);
  end;

da wo das * soll die procdedure NewMusik aufgerufen werden, aber wie mache ich das ?
er finded als funktion nur die crate eingenschaft.
hat da jemmand eine idee ?


AndyB - Mi 09.07.03 14:38
Titel: Re: Klassen Problem: er finde die funktion nicht.
mimi hat folgendes geschrieben:
er finded als funktion nur die crate eingenschaft.

Du befindest dich da ja auch im Sichtbarkeitsbereich von Test1 (wo ist da eigentlich das führende "T", oder heißt die Klasse etwa est1 ? :wink: ) und da gibt es nun mal keine NewMusik Methode. Diese gehört zum Sichtbarkeitsbereich von TSound. Du musst also in diesen Sichtbarkeitsbereich eintreten und das kannst du über die globale Variable Sound.


mimi - Mi 09.07.03 14:44

wie meinst du das ?
ich wollte keine variable definieren in der 1. klasse für sound.
könntes du mal ein beispiel machen wie du das meinst?

naja das t habe ich einfach weggelassen, weil es ja einfach nur ein Test da stellen soll.

Edit:
fehler gemacht beim posten: die gobale varibal sound gibt es garnicht. das war nur ein test aber so will ich das nicht machen weil es dann nicht mehr so geht wie ich es haben will.


maximus - Mi 09.07.03 15:07

Hi mimi,

hast du das so in der unit stehen?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
...
end

end
type 
  TSound = class 
    private 
      GoFlag:Integer;

...


Wenn ja, dann sollte dir klar sein, dass Quellcode nach 'end.' komplett ignoriert wird :wink:

Ansonsten musst du schon irgendwo einer referenz auf dein sound-obj haben, sonst is asche.


mimi - Mi 09.07.03 15:13

die klassen habe ich in zwei units aufgeteielt.
das geht leider nicht was du vorschlägt, da ich dann eine neue instanz der sound klasse erstellen müsste, aber das bringt leider nichts, weil ich die "Alten" werte haben wollte. gibt es da eine lösung für ?


AndyB - Mi 09.07.03 15:19

Wie würdest du denn auf NewMusik zugreifen, wenn du nicht in einem TThread wärst?

Zitat:
da ich dann eine neue instanz der sound klasse erstellen müsste

Also hast du schon irgendwo eine Instanz auf die du zugreifen kannst. Dann nimm doch diese.


mimi - Mi 09.07.03 16:59

problem: diese ist in einer anderen klasse definiert, und deshalb kann ich da auch nicht draufzugreifen. Gibt es noch weitere lösungen ?


AndyB - Mi 09.07.03 17:12

Du könntest dem Konstruktor des Threads die Instanz übergeben.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
  TTest1 = class(TThread) 
  private 
    { Private-Deklarationen } 
    FSound: TSound;
  protected
    procedure Execute; override
  public 
    constructor Create(ACreateSuspended: Boolean; Sound: TSound);
  end

constructor TTest1.Create(ACreateSuspended: Boolean; Sound: TSound);
begin
  FSound := Sound;
  inherited Create(ACreateSuspended);
end;


Execute ist übrigens als protected deklariert und sollte da auch bleiben.


mimi - Mi 09.07.03 19:36

ja stimmt hatte ich geänder aus einem andern grund,
kann man den consstructor eifnach so überschreiben ?
werde ich gleich mal testen.


AndyB - Mi 09.07.03 19:58

Da es kein virtueller Konstruktor wie bei TComponent ist: Ja.


mimi - Mi 09.07.03 20:04

danke, es hat funktiniert, aber leider habe ich noch kleiner fehler drin die ich aber selbst behben muss.