Autor Beitrag
mad.scientist
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 03.02.05 01:20 
Hallo zusammen,

ich möchte eine Menge, hier TMediaTypes, als Rückgabewert einer Funktion erhalten. Die Funktion GetMediaTypes() konvertiert einen String der Art 'MT_AUDIO, MTVIDEO' in eine Menge der Art [mtAudio, mtVideo]. Das Problem ist nur, dass in der Prozedur ReadFromFolder(), die das ganze verwenden soll, die richtige Menge nicht mehr ankommt. Die Abfrage (mtAudio in MediaTypes) and ... (Zeile 11-13) liefert true für alle drei mtXXX in MediaTypes, egal was der Rückgabewert der Funktion war. Wo ist mein Denkfehler?

Definition der Typen:
ausblenden Delphi-Quelltext
1:
2:
  TMediaType = (mtAudio, mtVideo, mtPicture);
  TMediaTypes = set of TMediaType;

Definition der Funktion zur Konvertierung String<->Set:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
function GetMediaTypes(MediaTypes: String): TMediaTypes;
begin
  Result := [];
  if Pos(_MEDIATYPE_AUDIO, MediaTypes) > 0 then Include(Result, mtAudio);
  if Pos(_MEDIATYPE_VIDEO, MediaTypes) > 0 then Include(Result, mtVideo);
  if Pos(_MEDIATYPE_PICTURE, MediaTypes) > 0 then Include(Result, mtPicture);
end;

Prozedur, die das ganze verwendet:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TXMLMenu.ReadFromFolder(Node: IXMLNode; Recursive: Boolean);
var
  sr: TSearchRec;
  Folder: String;
  MediaTypes: TMediaTypes;
begin
  Folder := IncludeTrailingPathDelimiter(VarToStr(Node.Attributes['path']));
  MediaTypes := GetMediaTypes(VarToStr(Node.Attributes['mediatypes']));
  if FindFirst(Folder + '*.*', faDirectory, sr) = 0 then begin
    repeat
      if ((mtAudio in MediaTypes) and IsAudioFile(sr.Name)) or
         ((mtVideo in MediaTypes) and IsVideoFile(sr.Name)) or
         ((mtPicture in MediaTypes) and IsPictureFile(sr.Name)) then begin
        ...

Schöne Grüße, Florian


Moderiert von user profile iconKlabautermann: Topic aus Sonstiges verschoben am Do 03.02.2005 um 03:20
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Do 03.02.05 12:26 
Moin,

ich kann auf anhieb keinen denkfehler entdecken. Aber vielleicht wird einer sichtbar, wenn du den code richtig formatierst und debugst. zB. die funktion würd ich so schreiben...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function GetMediaTypes(MediaTypes: String): TMediaTypes;  
begin  
  Result := [];  
  if Pos(_MEDIATYPE_AUDIO, MediaTypes) > 0 then 
    Include(Result, mtAudio); // hier nen breakPoint
  if Pos(_MEDIATYPE_VIDEO, MediaTypes) > 0 then 
    Include(Result, mtVideo); // hier nen breakPoint 
  if Pos(_MEDIATYPE_PICTURE, MediaTypes) > 0 then 
    Include(Result, mtPicture); // hier nen breakPoint 
end;


Dann mal schauen, ob der string das enthält, was du erwartest und schauen, ob vor sowie nach dem rücksprung das selbe im result steht.

....

Vergiss was ich da gesagt habe!

hab mir die if abfrage angesehen..
ausblenden Delphi-Quelltext
1:
2:
3:
 if ((mtAudio in MediaTypes) and IsAudioFile(sr.Name)) or  
         ((mtVideo in MediaTypes) and IsVideoFile(sr.Name)) or  
         ((mtPicture in MediaTypes) and IsPictureFile(sr.Name)) then begin

..so ist es natürlich klar, das immer true rauskommt, sofern ein element enthalten und die datei dem medienTyp entspricht. Immerhin prüfst du so schon mal, ob die datei einen gültiger medienTyp hat, sofern ein medienTyp im set angegeben ist.

Nur so sinnvoll sieht das nicht aus. Vielleicht eher so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
 if ((mtAudio in MediaTypes) and IsAudioFile(sr.Name)) then
    ...;           
  if ((mtVideo in MediaTypes) and IsVideoFile(sr.Name)) then
    ...;
  if ((mtPicture in MediaTypes) and IsPictureFile(sr.Name)) then 
    ...;


oder was hattest du vor?

_________________
mfg.
mâximôv
mad.scientist Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Mo 07.02.05 23:57 
Hi,

nochmal vielleicht zur Klarstellung, die Anweisung
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  MediaTypes := GetMediaTypes(VarToStr(Node.Attributes['mediatypes']));
  if FindFirst(Folder + '*.*', faDirectory, sr) = 0 then begin
    repeat
      if ((mtAudio in MediaTypes) and IsAudioFile(sr.Name)) or
         ((mtVideo in MediaTypes) and IsVideoFile(sr.Name)) or
         ((mtPicture in MediaTypes) and IsPictureFile(sr.Name)) then begin
      ...

soll immer dann, wenn mtXXX in MediaTypes enthalten ist und sr.Name ein entsprechendes IsXXXFile() ist, die ab begin folgenden Zeilen ausführen. Wenn aber z.B. MediaTypes = [mtAudio] und IsVideoFile(sr.Name) = true, dann sollte die ganze if-Konstruktion eigentlich false ergeben, oder?

Eigentlich, denn genau das tut sie nicht ...

Grüße, Florian
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 08.02.05 14:21 
Moin,

eigentlich sollte das von dir beschriebene verhalten eintreffen, sofern die funktion isXXXFile korrekt funktioniert. Hast du mal mit dem debugger alle schritte und werte überprüft? Wenn nicht tue dies bitte, dann müsste sehr schnell klar werden wasa hier schief läuft. Oder poste mehr code.

:)

_________________
mfg.
mâximôv
mad.scientist Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: So 13.02.05 22:54 
Hi,

wenn ich auf Zeile 1 im letzten Code-Beispiel einen Breakpoint setze und dann die Funktion GetMediaTypes im Debugger verfolge, sehe ich, dass der String korrekt in eine Menge vom Typ TMediaTypes umgesetzt wird, z.B. [mtAudio, mtVideo]. Wenn der Debugger wieder zurückspringt, also in Zeile 2 im Code, dann bekomme ich nur die lapidare Meldung "auf Variable kann wegen Optimierung nicht zugegriffen werden". Lässt sich das irgendwie ändern?

Gruß, Florian
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Mo 14.02.05 16:28 
mad.scientist hat folgendes geschrieben:
Hi,...

Lässt sich das irgendwie ändern?

Gruß, Florian


Ja: Projekt->Optionen->Compiler->CodeErzeugung->Optimierung := false

..sollte man aber zum release wieder anstellen!

_________________
mfg.
mâximôv