| Autor |
Beitrag |
mad.scientist
      
Beiträge: 17
|
Verfasst: 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:
Delphi-Quelltext 1: 2:
| TMediaType = (mtAudio, mtVideo, mtPicture); TMediaTypes = set of TMediaType; |
Definition der Funktion zur Konvertierung String<->Set:
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:
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 Klabautermann: Topic aus Sonstiges verschoben am Do 03.02.2005 um 03:20
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: 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...
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); if Pos(_MEDIATYPE_VIDEO, MediaTypes) > 0 then Include(Result, mtVideo); if Pos(_MEDIATYPE_PICTURE, MediaTypes) > 0 then Include(Result, mtPicture); 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..
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:
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 
      
Beiträge: 17
|
Verfasst: Mo 07.02.05 23:57
Hi,
nochmal vielleicht zur Klarstellung, die Anweisung
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
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: 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 
      
Beiträge: 17
|
Verfasst: 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
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: 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
|
|
|