Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Daten speichern und auslesen, wie am besten?


del1312 - Di 31.08.10 14:32
Titel: Daten speichern und auslesen, wie am besten?
Hallo Leute,

folgendes Prob:

Ich möchte gerne eine Datei erstellen, wo ich z.B. in jeder Zeile den Namen einer Folge von Simpsons speichere. Das würde ich per Editor anlegen und sollte so aussehen:

01x001 Folgen-Name
01x002 Folgen-Name
01x003 Folgen-Name

usw.

Nun nehme ich Simpsons mit mit Save.TV auf und speicher mir die auf dem Rechner ab. Die Datei die ich erhalten sieht so aus:

Die_Simpsons_Wer_hat_Mister_Burns_erschossen_28-08-2010_0630_385720.avi

Mein kleine Tool kann jetzt schon die unnötigen Zeichen aus dem Namen entfernen, ich kann manuell Staffel und Folgen-Nr auswählen und per klick speichert er mir
die Folge brav in mein Archiv. Das Ganze klappt eigentlich schon echt super und der Name sieht dann nach dem umwandeln so aus:

03x103 Wer_hat_Mister_Burn_erschossen.avi


Die 03 Steht für Staffel 3 und die 103 für die Folgen-Nr. Wie gesagt eigenlich klappt es schon ganz gut, aber man muss immer in der Liste nachschauen und die Folge
erstmal raussuchen und per Hand Staffel und Folgen-Nr hinzufügen. Nun würde ich das gerne automtisieren. Wenn ich nun ne Folge in mein Tool anklicke, dann soll er den
Namen mit der Liste abgleichen, die Folge erkennen und automatisch den Namen vergeben inkl Staffel und Folgen Nr und am Ende in meinem Serienarchiv speichern.
Ich hoffe ihr könnt mir noch folgen ;o)

Wie mach ich das am besten mit der Liste? Nehm ich da ne normale Text Datei kopiere da meine Liste von Folgen rein? Habt ihr ein paar Ideen? Will ja keine Komplettlösung,
nur ein paar Tipps ;o)

DANKE!


elundril - Di 31.08.10 14:37

Also ich würde in deinem Fall eher zu ner Datenbank tendieren, da man mit dem ding viel schönere abfragen machen kann. :)


del1312 - Di 31.08.10 14:40

Oh na dann wird das aber gleich noch viel Komplexer oder? Kannst du mir ein paar Starttipps dazu geben?

Also ich hab jetzt mal die Textdatei einfach in eine Listbox ausgelesen, jetzt müsste ich nur noch irgendwie vergleichen.
Wie kann ich in der ListBox nach Strings suchen also z.B nach "*Burn*" ?

Hatte das hier aber es klappt nicht:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var iFound: Integer;
begin
  iFound := ListBox2.Items.IndexOf(Edit6.Text);
  if iFound >= 0
  then ShowMessage('Das gesuchte Wort wurde an ' + IntToStr(iFound) + 'ter Stelle gefunden.')
  else ShowMessage('Das gesuchte Wort wurde nicht gefunden.');
end;


Da finde ich nur die ganze Zeile, aber wie mach ich das, wenn ich nur ein paar Buchstabenfolgen in der Zeile suche?


Nersgatt - Di 31.08.10 15:32

Du musst alles Items die Listbox durchgehen, und z.B. mit Pos/PosEx nach dem gesuchten Teilstring in dem einzelnen Item suchen.


Xion - Di 31.08.10 21:21

Ich bin ein absoluter Fan von Ini-Files.

Total simpel über TIniFile zu machen, funktioniert wie eine kleine Datenbank (kommt natürlich auf deine Datenmengen drauf an, für alle Simpsons-Folgen reichts auf alle Fälle) und ist platzsparend und unkompliziert. Wobei natürlich schlecht ist, dass du ja darin suchen willst...vielleicht ist ini dann doch nicht so gut.


elundril - Di 31.08.10 22:37

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Ich bin ein absoluter Fan von Ini-Files.

Total simpel über TIniFile zu machen, funktioniert wie eine kleine Datenbank (kommt natürlich auf deine Datenmengen drauf an, für alle Simpsons-Folgen reichts auf alle Fälle) und ist platzsparend und unkompliziert. Wobei natürlich schlecht ist, dass du ja darin suchen willst...vielleicht ist ini dann doch nicht so gut.


Lass mich dazu mal einen Post von Jaenicke zitieren aus einem anderen Thread:

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Noch dazu sind die API-Funktionen, auf denen TIniFile aufbaut, als deprecated markiert, sollten also möglichst nicht mehr verwendet werden...
Eben weil das INI-Format noch ein Relikt aus den alten Windowsversionen ist, werden auch die entsprechenden Funktionen nur noch mitgeschleppt. Es kann aber passieren, dass es in einer der nächsten Windowsversionen diese Funktionen nicht mehr gibt. Und dann funktionieren auch alle Programme, die die nutzen, nicht mehr...


lg elundril


jaenicke - Mi 01.09.10 03:10

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
funktioniert wie eine kleine Datenbank
Diese Beschreibung hört sich eher nach XML an. Dort kannst du via XPath auch Abfragen wie diese machen:

XML-Daten
1:
sum(Test/*/Betrag[@x > 6])                    
Nimm alle Unterknoten von Test, deren Unterknoten Betrag ein Attribut x hat, das größer als 6 ist. Und jetzt gib mir die Summe der Beträge.

Natürlich kannst du dir die Knotenliste auch zurückgeben lassen. Und das alles nur über die MSXML Bibliotheken, die du einfach importieren kannst. (Und natürlich gibt es auch andere Bibliotheken.)

Diese Abfragen sind auch ziemlich schnell.

Hier in diesem Fall könnte eine solche Abfrage auch direkt die richtige Folge ermitteln.


del1312 - Mi 01.09.10 08:50

Danke Leute für euche Tipps, also ich hab das jetzt so gemacht:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
var iFound, gefunden, i: Integer;

begin
For i:=0 to listbox2.items.count-1 do
if pos(edit6.text,listbox2.items[i])<>0 then
   begin
    Staffel:='01';
    if i >25 then Staffel:='02';
    if i >50 then Staffel:='03';
    if i >75 then Staffel:='04';
    if i >100 then Staffel:='05';
    if i >125 then Staffel:='06';
    if i >149 then Staffel:='07';
    if i >171 then Staffel:='08';
    if i >194 then Staffel:='09';

    ShowMessage('Staffel: ' + Staffel + ' / Folge: '+ (IntToStr(i))+ ' - ' + ListBox2.Items.Strings[i]);
   end;
Edit6.Text:='';


Jetzt klappt das soweit ganz gut, nur ein Problem hab ich noch. Ich hätte gern das die Groß/Kleinschreibung ignoriert wird. Momentan muss ich genau so den Text zum suchen eingeben
wie er hinterlegt ist. Also statt: "burns" muss ich es so momentan eingeben: "Burns" wie kann ich die am besten umsetzen? Wenn ich das noch hinbekomme ist mein kleines Tool echt
schon perfekt ;o) D


jaenicke - Mi 01.09.10 09:04

Beides vor dem Vergleich mit Pos mit LowerCase umwandeln. ;-)


del1312 - Mi 01.09.10 10:09

Cool vielen Dank! jetzt klappt alles :D

Eins hab ich noch, wie kann ich in einem Namen das Zeichen _ mit einem Leerzeichen ersetzen?


trm - Mi 01.09.10 10:21

user profile icondel1312 hat folgendes geschrieben Zum zitierten Posting springen:
Cool vielen Dank! jetzt klappt alles :D

Eins hab ich noch, wie kann ich in einem Namen das Zeichen _ mit einem Leerzeichen ersetzen?


Es gibt z.B. StringReplace.


Delphi-Quelltext
1:
2:
3:
       DEINSTRING := StringReplace(DEINSTRING, '_'#32, [rfReplaceAll]);
ODER zum besseren Verständnis:
       DEINSTRING := StringReplace(DEINSTRING, '_'' ', [rfReplaceAll]);


rfReplaceAll ersetzt ALLE _ im String. Ohne rfReplaceAll wird nur das erste gefundene ersetzt :)


del1312 - Mi 01.09.10 10:31

Ah wieder was gelernt, vielen Dank jetzt bin ich rundum zufrieden :o) Ihr seid klasse hier im Forum :wink: :D