Hi,
Zitat von
Headi:
Also zuerst mal was ich schon hingekriegt habe:
- sfv dateien laden
- dateien prüfen ob verhanden
- dateien auf crc32 überprüfen
- sfv dateien erstellen
Schon mal Gratulation für dein Programm so weit!
Zitat von
Headi:
Und hier meine Probleme:
- sfv dateien sind so aufgebaut: "datei crchash" beim leerzeichen trenne ich die zwei angaben, Allerdings gibs ein fehler wenn im Dateinamen auch leerzeichen sind (achja hash wert ist immer 8 zeichen lang, also müsste ich ja sagen können er muss immer beim achten zeichen von rechts trennen oder?)
- in manchen sfv Dateien sind noch kommentare enthalten, welche er ignorieren soll. kommentare beginnen immer mit ";"
- beim crc check friert das Programm ein
- ich würde gerne während dem checken eine Fortschritts Anzeige haben
Wie trennst du denn im Moment? Du solltest dir die Funktionen für String-Verarbeitung anschauen, hier insbesondere RightStr und LastDelimitter.
Mittels RightStr kannst du dir den Teilstring rechts von einer Position zurückgeben lassen, mit LeftStr den Links von einer Position, copy ist auch eine Möglichkeit (gibt noch viele weitere). Hier könntest du absolut die 8 Zeichen benutzen oder um flexibler zu bleiben kannst du dir mit LastDelimitter die Position des letzten Auftrauchens eines Zeichens (bei dir also Space) zurückgeben lassen.
Eine weitere Alternative wäre es natürlich, dir durch ein TStringList Objekt und gesetztem Delimitter den String in alle Einzelteile zerlegen zu lassen und alle ausser dem letzten wieder zusammen zu setzen (hier aber vorher einen String anlegen, der alle anderen aufnehmen kann).
Um Kommentare zu filtern (sind doch Zeilenkommentare?), kannst du dir mittels Pos die Position eines ";" zurückgeben lassen. Der String der dich dann interessieren sollte geht von 1 bis Pos(';', geleseneZeile) - 1
Ja, warum bei crc das Programm einfriert kann ich jetzt natürlich nicht sagen (noch nicht deinen Code geladen).
Fortschrittsanzeige? Sollte eigentlich kein Problem sein. Musst dir nur überlegen, wann du die am sinnvollsten updatest (also nicht 100000 Schritte, wenn nur 100 verschiedene angezeigt werden). Am einfachsten denke ich kann man soetwas mit einer Methode machen, die bei einem Fortschritt aufgerufen wird.
Da gibt es dann mehrere Möglichkeiten, die einfachste wäre es einfach einen Fortschrittsbalken zu übergeben. Ist aber unschön, du wärst natürlich an diesen gebunden und es müsste für eine andere Komponente der Code geändert werden.
Eine weitere Möglichkeit bestünde darin, einfach einen Methodenzeiger (procedure(const progress : Cardinal) of Object) zu definieren und dann halt eine Methode zuzuweisen.
Alternativ (und etwas mehr
OOP) einfach ein Interface definieren, dass eine solche Methode deklariert und dann in dein Objekt, in dem der Fortschritt stattfindet ein Listener-Modell einbauen (also registerListener, notifyListener und removeListener), dann kannst du beliebig viele Objekte über einen Fortschritt informieren (eben alle registrierten Listener).
Gruß Der Unwissende