AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Datein in ein program einbinden

Ein Thema von Dalai Lama · begonnen am 5. Okt 2006 · letzter Beitrag vom 11. Jan 2007
Thema geschlossen
Seite 1 von 2  1 2      
Dalai Lama

Registriert seit: 21. Jan 2006
6 Beiträge
 
#1

Datein in ein program einbinden

  Alt 5. Okt 2006, 21:10
hallo

ich porgrammiere noch nicht so lange wollte mich aber trotzdem mal versuchen.
ich hatte auf meinem rechner ne menge songtexte und da dachte ich mir schreibe ich ein programm mit dem man die verwalten kann. das ging auch recht schnell und einfach und ist auch nichts besonderes.

Download hier

jetzt wollte ich aber das man bei jeder band nen button hat wo man neue songtexte hinzufügen kann die dann auch im program gespeichert werden. da hbe ich aber keine ahnung wie man das amchen kann. ein freund hat mir versucht zu helfen aber das hat auch nicht geklappt. wäre nett wenn ihr mir helfen könntet.

mfg
JoJo
 
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Datein in ein program einbinden

  Alt 5. Okt 2006, 21:14
Eine Datenbank wäre eine nette Idee. Falls das zu aufwändig ist, arbeite einfach mit Textfiles, die durch einen Delimiter getrennt sind.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
 
Dalai Lama

Registriert seit: 21. Jan 2006
6 Beiträge
 
#3

Re: Datein in ein program einbinden

  Alt 6. Okt 2006, 11:21
danke für die antwort nur kann ich damit recht wenig anfangen
 
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Datein in ein program einbinden

  Alt 6. Okt 2006, 11:33
Was verstehst du nicht, das mit den datenabnken oder Textdatein mit Texttrenner (CSV)?
Markus Kinzler
 
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#5

Re: Datein in ein program einbinden

  Alt 6. Okt 2006, 11:43
Hi,
und herzlich willkommen in der DP

Erstmal eine kleine Warnung vorweg, du hast schon Songtexte in deinem Programm gespeichert. Im Moment laufen da einige Debatten und Klagen, ich glaube mich zu erinnern, dass genau das (Songtexte veröffentlichen) als illegal gilt. Wenn du das Programm als Verwaltung für Songtexte (ohne Inhalt) zur Verfügung stellst oder nur mit solchen gefüllt, die explizit eine Lizenz besitzen, die die Veröffentlichung erlaubt bist du jedenfalls auf der sicheren Seite!

Was dein eigentliches Problem angeht, so musst du dir anschauen, was für Datenstrukturen so zum Speichern in Frage kommen. Eine Datenbank dürfte hier erstmal völlig unangebracht sein, zumal du ja selbst sagst, dass du noch nicht lange programmierst.
An sich ist die einfachste Idee, dass du alle Einträge in einer Datei schreibst und die Datei dann beim Start aut. lädst.

Da gibt es dann wiederum verschiedene Formate, die in Frage kommen. Du kannst z.B. eine Ini-Datei verwenden, da gibt es Sektionen und in jeder Sektion ein Schlüssel-Wert Paar. Ein Wert (in dem Fall der Songtext) lässt sich eindeutig über seine Sektion (z.B. der Interpret) und dem Schlüssel (der Song) auslesen. Mehr dazu findest du in der Hilfe unter TIniFile und TMemIniFile.

Eine Alternative wären dann noch die Character Seperated Files (.csv), die kommen z.B. als einfachstes Austauschformat bei Excel (oder anderen Tabellenkalkulationsprogrammen) zum Einsatz. Wieder eine reine Textdatei. Jede Zeile der Datei entspricht einer Zeile in einer Tabelle. Da es sich um eine Tabelle handelt, hast du natürlich auch Spalten, die werden einfach durch ein Trennzeichen (den Seperator) kodiert. Würdest du also eine Tabelle erstellen, in der du die Spalten Künstler, Song, Songtext hast, dann würdest du in die Datei etwas schreiben wie "Künstler;Song;SongText" (ohne " ") und das Semikolon würde immer eine neue Spalte markieren. Das Trennzeichen ist dabei beliebig, typisch sind Komma und Semikolon, es kann aber auch ein Tabulator oder jedes andere Zeichen verwendet werden. Zum Schreiben kannst du eine einfache TStringList nehmen (die bietet Funktionen um eine Liste von Strings in eine Datei zu schreiben). Die Strings setzt du einfach aus den einzelnen Eingaben (Künstler, Name, Songtext) zusammen. Eine TStringList kann so eine (Text-)datei auch wieder einlesen, aber das zerlegen der Strings solltest du lieber mit einem Tokenizer (einfach mal hier nach Tokenizer oder StringTokenizer suchen) vornehmen. Die TStringList sieht ein Leerzeichen immer als Trennzeichen an (was du nicht willst).

Dann gäbe es noch die Möglichkeit, dass du XML verwendest. Dies ist eine Auszeichnungssprache, die Einzelheiten würden hier etwas weit gehen. Du hast sicherlich schon von XML gehört, da solltest du dir dann einfach ein Tutorial zu dem Thema (auch Delphi und XML) anschauen. Ist nicht so kompliziert, aber man sollte sich hier ruhig die Grundlagen anschauen.

Alternativ bleiben immer noch binäre / eigene Formate, aber das macht hier keinen Sinn (du würdest unnötig das Rad neu erfinden).
Wenn das alles mit Textdateien klappt (alle hier genannten Formate sind reine Textdateien in spezieller Formatierung), dann kannst du dir noch Packer und Delphi anschauen, dann werden die Dateien auch immer winzig bleiben

Gruß Der Unwissende
 
Dalai Lama

Registriert seit: 21. Jan 2006
6 Beiträge
 
#6

Re: Datein in ein program einbinden

  Alt 6. Okt 2006, 11:48
vielen dank. ich werde mal mein glück versuchen. ein kumpel will mir auch helfen
 
Dalai Lama

Registriert seit: 21. Jan 2006
6 Beiträge
 
#7

Re: Datein in ein program einbinden

  Alt 9. Okt 2006, 11:59
könntet ihr mir eventuell einen auszug aus nem quelltext zeigen wo man sieht wie man das machen muss
 
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#8

Re: Datein in ein program einbinden

  Alt 9. Okt 2006, 12:11
Zitat von Dalai Lama:
könntet ihr mir eventuell einen auszug aus nem quelltext zeigen wo man sieht wie man das machen muss
Wie man was genau machen muss?
Deine Frage war doch sehr allgemein, wie ich schon sagte gibt es mehr als einen Weg. Wenn du also Hilfe möchtest, solltest du wenigstens die Richtung nennen. Ansonsten gibt es in der OnlineHilfe zu jedem Thema eigentlich auch immer gute Beispiele. Schau dir die erstmal an und frag dann einfach nach, wenn du dort etwas nicht verstehst.

Gruß Der Unwissende
 
Dalai Lama

Registriert seit: 21. Jan 2006
6 Beiträge
 
#9

Re: Datein in ein program einbinden

  Alt 9. Okt 2006, 12:26
du hattes das geschrieben
Zitat:
Du kannst z.B. eine Ini-Datei verwenden, da gibt es Sektionen und in jeder Sektion ein Schlüssel-Wert Paar. Ein Wert (in dem Fall der Songtext) lässt sich eindeutig über seine Sektion (z.B. der Interpret) und dem Schlüssel (der Song) auslesen. Mehr dazu findest du in der Hilfe unter TIniFile und TMemIniFile.
jetzt wies ich aber netw ei ich die ini datei einlesen kann. wenn ich das versucht habe mit loadfromfile dann war die immer leer. und wenn ich in die datei nen neuen eintrag rein mache da stehen doch da immer noch zusätzliche zeichen und nicht nur der eigentliche text. die würden ja dann in der combobox mit auftauchen
 
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#10

Re: Datein in ein program einbinden

  Alt 9. Okt 2006, 13:02
Wie gesagt, die Hilfe hilft eigentlich schon weiter.

Aber kurz ein wenig zum TIniFile (TMemInifile verhält sich an vielen Stellen analog, du arbeitest aber nur im Speicher, musst also explizit zurückschreiben).

Eine Ini-Datei ist eine reine Textdatei. Es gibt jedoch eine spezielle Formatierung, die Delphi hier für dich auto. berücksichtigt. Du hast Sektionen, Schlüssel und Werte.
Der Name einer Sektion muss eindeutig/einzigartig in der gesamten Datei sein. Eine Sektion wird durch Eckige Klammern angezeigt [Sektionsname].
Zu jeder Sektion kannst du beliebig viele Schlüssel-Wertpaare erzeugen. Hier muss der Schlüssel innerhalb einer Sektion eindeutig sein, er kann aber in z.B. in zwei verschiedenen Sektionen verwendet werden. Der Schlüssel ist eine Zeichenkette der Wert des Schlüssels auch (der kann aber auch interpretiert werden). Die Zuweisung wird durch ein = angezeigt. Grob hat also eine Ini-Datei den Aufbau

Code:
[Sektion1]
Schlüssel1=Wert1
Schlüssel2=Wert1

[Sektion2]
Schlüssel1=Wert2
Schlüssel3=Wert3
...
Der Zugriff auf eine solche Datei erfolgt in Delphi gekapselt durch die Klasse TIniFile und Nachfolger. Der Name der zu öffnenden Datei wird im Konstruktor übergeben, dabei solltest du immer mit dem absoluten Pfad arbeiten, diesen aber auch erst zur Laufzeit ermitteln. Es gibt zu jedem Programm immer ein aktuelles Arbeitsverzeichnis. Gibts du relative Pfade an (z.B. nur DeineIni.ini), so die Datei im aktuellen Arbeitsverzeichnis gespeichert oder gesucht. Bei der Auswahl durch einen Lade/Speichern Dialog eines Verzeichnis änderst du (u.A.) dieses Verzeichnis, hier könntest du dann Probleme bekommen, wenn du den Pfad relativ angibst. Besser ist es, wenn du weißt wie der Pfad zur Laufzeit ermittelt werden kann. Im einfachsten Fall hast du ein Verzeichnis, dessen Position relativ zur gestarteten Exe du kennst (im einfachsten Fall liegt beides im gleichen Ordner). Den Pfad zu deiner Exe ermittelst du einfach mit ExtractFilePath(ParamStr(0)). Der absolute Pfad wäre dann (ini im Verzeichnis der Exe): ExtractFilePath + 'DeineIni.ini'

Hast du nun ein TIniFile Objekt erzeugt, kannst du wahlfrei auf einzelne Werte zugreifen. Ein Wert kann immer durch die Sektion und den Schlüssel ermittelt werden. Ein Problem dass du bei deinem Projekt haben kannst ist, dass du nicht alle Sektionen kennst. Ich gehe hier mal einfach davon aus, dass du für jeden Künstler eine Sektion anlegst, jeder Song ist dann ein Schlüssel, jeder Songtext ist der Wert.
Liest du also die Ini ein, hast du eine bestimmte Anzahl von dir noch unbekannten Künstlern. Du musst also erstmal schauen, welche Sektionen / Künstler existieren in der Datei. Dazu gibt es die Funktion ReadSections. Hier werden alle Sektionen ausgelesen und in ein TStrings Objekt geschrieben. TStrings ist ein abstrakter Datentyp, du kannst hier z.B. eine TStringList nehmen. Der Name TStringList sagt dann auch schon deutlicher was du hier verwendest, es handelt sich um eine Liste von Strings. Wie man mit einer TStringList arbeitet ist nicht weiter kompliziert, du legst sie mit Create an und übergibst diese Instanz an die Methode ReadSections. Danach kannst du mit der Eigenschaft Count schauen wie viele Strings in der StringList stehen und wie bei einem Array mittels [index] auf den String an der Stelle [index] zugreifen.
Der nächste Schritt wäre es nun, dass du zu jedem Künstler seine Songs einliest. Auch hier hast wieder eine unbekannte Anzahl von Elementen, auch hier kannst du aber auf die Kapselung zurückgreifen. Für jede Sektion kannst du einfach ReadSection aufrufen. Readsection selbst liest einfach die Schlüssel in der Sektion ein und schreibt diese wiederum in ein TStrings Objekt. Nun hast du die Sektion (Künstler), alle Schlüssel (Titel) und kannst zu jedem Schlüssel dieser Sektion den Wert einlesen, dazu wird dann einfach readString verwendet. Hier findest du aber auch Alternativen, die für dich bereits eine Typumwandlung durchführen (z.B. readInteger oder readBool).
Das wäre schon der ganze Weg für das Lesen.

Delphi-Quellcode:
var iniFile : TIniFile;
    interpreten : TStringlist;
    songs : TStringList;
    text : String;
    i : Integer;
    j : Integer;
begin
  iniFile := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'WasAuchImmer.ini');
  
  try
    interpreten := TStringList.Create;
    songs := TStringList.Create;

    try
      iniFile.ReadSections(interpreten);
      
      if interpreten.Count > 0 then
      begin
        for i := 0 to interpreten.Count - 1 do
        begin
          songs.Clear;
          
          iniFile.ReadSection(interpreten[i], songs);
          
          if songs.Count > 0 then
          begin
            for j := 0 to songs.Count - 1 do
            begin
              text := iniFile.ReadString(interpreten[i], songs[j], '');
              
              // jetzt enthält Text den gespeicherten Wert.
              // interpreten[i] zeigt den aktuellen Interpreten an
              // songs[j] enthält den Songtitel
            end; // for j := 0 to songs.Count - 1
          end; // if songs.Count > 0
        end; // for i := 0 to interpreten.Count - 1
      end; // if interpreten.Count > 0
    finally
      songs.Free;
      interpreten.Free;
    end;
  finally
    iniFile.Free;
  end;
So, jetzt hast du das ganze als Codebeispiel. Allerdings ist das so kein schöner Code! Du solltest hier lieber mehr als eine Methode verwenden (z.B. das Lesen eines Songs oder aller Songs des Interpreten trennen).
Jedenfalls ist das schon die komplette Logik beim Lesen. Schreiben ist noch viel einfacher, du verwendest einfach die WriteString Methode von TIniFile. Wenn du mit TMemIniFile arbeitest, wird die Datei erst beim Aufruf von Update gespeichert.

Gruß Der Unwissende
 
Thema geschlossen
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz