![]() |
Fehlende Dateien in INI nicht laden/anzeigen
Fortsetzung dieses Threads:
![]() Hallo liebe DPler, in meinem letzten Thread ging es darum, aus einer INI-Datei 3 Komponenten zu speißen - MediaPlayer, ListBox & Memo. Mit der Hilfe aus dem Forum hab ich es wunderbar hinbekommen (Nochmals vielen Dank dafür! :dp: ). Nun soll das Programm erweitert werden und ich stehe mit selbem Projekt vor einem neuen Problem, das ich selbst nach Stunden des Tüftelns und Rumprobierens nicht in den Griff bekomme. Nun brauche ich erneut eure Hilfe, es geht um Folgendes: Da mein Programm seine ganzen Informationen aus einer INI zu beziehen hat kann es auch einmal zu Fehleintragungen in der INI selbst kommen. Nun soll der User nicht gleich durch Fehlermeldungen aus der Ruhe gebracht werden, sondern das Programm soll folgendermaßen reagieren: 1. Ließ die INI 2. Prüfe ob die Dateipfade aus der INI zu existierenden Dateien führen 3. Liste fehlerhafte Einträge gar nicht erst auf Das Prüfen mit FileExists funktioniert und der Eintrag komm in der ListBox nicht vor, ABER mein Programm läd lediglich den Namen aus der nächsten Section, Pfad (MediaPlayer) und Beschreibung (Memo) werden aus der Section geladen, die eigentlich übersprungen werden sollte. Kurzum: Er lädt Titel 3 obwohl 4 gewählt wurde. Das direkte Löschen der fehlerbehafteten Section aus der INI hat den Fehler auch nicht behoben (Er hat glaub ich sogar ne Exception geschmissen, weil Listenindex > Maximum). Ich hab auch mit mehreren internen TStringLists versucht, die INI komplett in mein Programm zu laden und programmintern die Einträge zu löschen, was aber an den (nicht) bereitgestellten Methoden scheiterte (oder sie sind mir noch unbekannt). Hier noch der Code:
Delphi-Quellcode:
Vielen Dank schon mal für eure Mühen,
procedure TForm1.FormCreate(Sender: TObject);
var i: Integer; Sektionen: TStringList; begin VideoIni := TIniFile.Create(PChar(ExtractFilePath(ParamStr(0)) + 'files.ini')); Sektionen := TStringList.Create; ListBoxFiles.Items.Clear; VideoIni.ReadSections(Sektionen); // Alle Sektionsnamen sind nun in Sektionen gespeichert. for i := 0 to Sektionen.Count - 1 do if FileExists(VideoIni.ReadString(Sektionen[i],'Path','')) then //Prüfe auf vorhandene Datei begin ListBoxFiles.Items.Add(VideoIni.ReadString(Sektionen[i], 'Name','')); //Wenn vorhanden -> ListBox Eintrag hinzufügen end; end; procedure TForm1.ListBoxFilesClick(Sender: TObject); begin try MemoDesc.Text := VideoIni.ReadString('Video' + IntToStr(ListBoxFiles.ItemIndex),'Desc','KEINE BESCHREIBUNG VORHANDEN'); //Lade Beschreibung MediaPlayerControl.FileName := VideoIni.ReadString('Video' + IntToStr(ListBoxFiles.ItemIndex),'Path',''); //Setze Dateiname für ausgewähltes Video MediaPlayerControl.Open; except error_with_file; //Falls dennoch was schief geht end; end; MfG SoD |
Re: Fehlende Dateien in INI nicht laden/anzeigen
Kannst Du einmal eine beispielhafte Ini posten?
|
Re: Fehlende Dateien in INI nicht laden/anzeigen
Oh sorry, sicher kann ich das...
Code:
Seit dem letzen Mal hat sich daran halt nur nicht viel geändert.
[Video0] ; Vorhanden
Path=.\Tutorials\dms_formletter.wmv Name=Serienbrief Desc=Zeigt, wie mit dem DMS ein Serienbrief erstellt werden kann. ; Testvideos zur Fehlersuche [Video1] Path=C:\windows\clock.avi ; Vorhanden Name=Video1 Desc=Video1 [Video2] Path=C:\clock.avi ; Gibt's nicht - Fehlerprovokation Name=Video2 Desc=Video2 [Video3] Path=C:\WINDOWS\Clock.avi ; Vorhanden Name=Video3 Desc=Video3 |
Re: Fehlende Dateien in INI nicht laden/anzeigen
Zitat:
Von vorn nach hinten (Index 0 bis maximum) oder umgekehrt? Du mußt rückwärts löschen, wenn du eine For-Schleife nutzt (bei While mit angepaßtem Index geht's dennoch vorwärts) Denn wenn du was löschst, verschieben sich die dahinterliegenden Daten um einen Index vor. > 0 1 2 3 4 5 6 wenn ich z.B. die 3 lösche und dann auf die 6 zugreifen will > *boom* es kracht, da die 6 ja nun die 5 ist :stupid: |
Re: Fehlende Dateien in INI nicht laden/anzeigen
Zitat:
|
Re: Fehlende Dateien in INI nicht laden/anzeigen
Zitat:
Delphi-Quellcode:
(Achtung Pseudocode: nicht zum direkten Nachmachen geeignet :stupid: )
// im prinzip statt dem
for i := 0 to ini.Count - 1 do if exists(ini.value[i]) then delete(...); // es einfach sorum versuchen ^_^ for i := ini.Count - 1 downto 0 do if exists(ini.value[i]) then delete(...); |
Re: Fehlende Dateien in INI nicht laden/anzeigen
Hab's mal deinem Beispiel entsprechend in meinem Code versucht aber dann lädt er die Liste verkehrt herum, was ja eigentlich auch die Anweisung im Code vorgibt. Nur wäre es nicht ganz so wahrheitsgemäß, wenn das letzte Video in der ListBox dem eigentlich ersten Eintrag in der INI entspricht. ;)
|
Re: Fehlende Dateien in INI nicht laden/anzeigen
Der Code war ja nicht für das Laden gedacht, sondern zum Löschen ungültiger Einträge ;)
|
Re: Fehlende Dateien in INI nicht laden/anzeigen
wenn du Löschen und Laden gleichzeitig machen willst, dann mußt du deine Liste dann natürlich auch nochmals "andersrum" (doppelt umgedreht, also jetzt sozusagen wieder richtig) anzeigen :zwinker:
|
Re: Fehlende Dateien in INI nicht laden/anzeigen
Oder eben halt die ungültigen Einträge gar nicht erst mitladen oder umgekehrt ausgedrückt, nur ausschließlich die laden die gültig sind. Das war ja auch der ursprüngliche Plan, nur hab ich keinerlei Methode gefunden, mit der ich das im Nachhinein bewerstelligen könnte. Und das Problem, dass die falschen Daten zum Falschen Eintrag geladen werden besteht ja weiterhin.
[edit] Das mit dem doppelt rückwärts laden hat nicht ganz so geklappt, er sagt bei Video3 immer noch erster Eintrag in der INI Datei (dms_formletter.wmv). [/edit] |
Re: Fehlende Dateien in INI nicht laden/anzeigen
Erstell Dir doch ein Objekt mit den ensprechenden Eigenschaften und füge dieses mit ListBox.Items.AddObject in die Listbox ein.
|
Re: Fehlende Dateien in INI nicht laden/anzeigen
Zitat:
Verhält sich das dann auch noch wie die INI? Oder werden die Eigenschaften immer wieder überschrieben, wenn der nächste INI Eintrag nachgeschoben wird? |
Re: Fehlende Dateien in INI nicht laden/anzeigen
Das Objekt hat mit der Ini nur insofern zu tun, als dass es seine Eigenschaften in der Ini speichern bzw. aus ihr laden würde. Du erstellst Dir also eine Klasse mit den Eigenschaften Pfad, Name und Beschreibung. Wenn Du die Ini ausliest, machst Du Deine Prüfung und legst bei Erfolg eine Instanz Deiner Klasse an, befüllst die Eigenschaften und fügst sie in die Listbox ein.
[edit] Ich hatte gerade etwas Zeit und habe schnell ein Beispiel erstellt (nur ein Formular mit einer Listbox):
Delphi-Quellcode:
[/edit]
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) ListBox1: TListBox; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ListBox1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} //Deklaration der Klasse type TMyClass = class private FName, FBeschreibung, FPfad: string; public property Name: string read FName write FName; property Beschreibung: string read FBeschreibung write FBeschreibung; property Pfad: string read FPfad write FPfad; end; //Erzeugen von 3 Objekten und Einfügen in die Listbox procedure TForm1.FormCreate(Sender: TObject); var MyClass: TMyClass; begin MyClass := TMyClass.Create; MyClass.Name := 'Bla'; MyClass.Beschreibung := 'Erstes Objekt'; MyClass.Pfad := 'C:\Windows'; ListBox1.Items.AddObject(MyClass.Name,MyClass); MyClass := TMyClass.Create; MyClass.Name := 'Blubb'; MyClass.Beschreibung := 'Zweites Objekt'; MyClass.Pfad := 'C:\Windows\System'; ListBox1.Items.AddObject(MyClass.Name,MyClass); MyClass := TMyClass.Create; MyClass.Name := 'Wuppdi'; MyClass.Beschreibung := 'Drittes Objekt'; MyClass.Pfad := 'C:\Windows\System32'; ListBox1.Items.AddObject(MyClass.Name,MyClass); end; //Freigeben der Objekte procedure TForm1.FormDestroy(Sender: TObject); var Current: integer; begin for Current := ListBox1.Items.Count - 1 downto 0 do (ListBox1.Items.Objects[Current] as TMyClass).Free; end; //Werte des angeklickten Objektes anzeigen procedure TForm1.ListBox1Click(Sender: TObject); var MyClass: TMyClass; begin if ListBox1.ItemIndex > -1 then begin MyClass := ListBox1.Items.Objects[ListBox1.ItemIndex] as TMyClass; if Assigned(MyClass) then ShowMessage(Format('%s%s%s%s%s',[MyClass.Name,sLineBreak,MyClass.Pfad, sLineBreak,MyClass.Beschreibung])); end; end; end. |
Re: Fehlende Dateien in INI nicht laden/anzeigen
Zitat:
Oder muss ich da auch mit ReadString anrücken? :gruebel: |
Re: Fehlende Dateien in INI nicht laden/anzeigen
Du musst der Klasse "TMyClass" eben noch die notwendigen Methoden spendieren, die die Daten aus einer Ini laden oder speichern.
Edit: Es ist wohl doch so gedacht, dass du deine Daten aus einer Ini ausliest, überprüfst und dann anstelle der im Beispiel gezeigten Anweisungen einer Instanz der Klasse zuweist. Dann hast du in deiner Liste nur Daten, die auch gültig sind. |
Re: Fehlende Dateien in INI nicht laden/anzeigen
Genau, mir ging es nur darum zu zeigen, wie man Objekte in TStrings ablegen kann. Ob man diese nun statisch erzeugt oder dynamisch anhand bestimmter Gegebenheiten, ist dafür ja zweitrangig.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 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