Delphi Fragen zu TOpenDialog & Dateilese

Dieses Thema im Forum "Programmieren" wurde erstellt von Angel-HRO, 30. Juni 2003.

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. Angel-HRO

    Angel-HRO Megabyte

    Registriert seit:
    31. August 2000
    Beiträge:
    2.524
    Hi
    bin gerade an einem Delphi Projekt, und stecke fest. Dabei 2 Sachen, die mich eher nerven, als die Funktion behindern und eines eben. da komm ich net weiter.
    (1) Ich such mich tot nach ner Funktion, wie man das Programmsymbol ändern kann (ist eher unwichtig, da kosmetischer Natur)

    (2) im Ich lese nen Dateipfad in ein Edit Fenster mit der Funktion TOpenDialog ein. Ich möchte gerne, dass der Dateityp (also sein suffix) fest vorgegeben ist. Klappt mit Standardtypen gut. Mein Problem: er soll eine .e04 Datei einlesen. gebe ich unter DefaultExt e04 ein, passiert nix. Mag daran liegen, dass es kein Windowsformat ist (kann höchstens mit dem Editor gelesen werden, ist aber Müll. Nach ner Konvertierung siehts viel besser aus

    (3) Programm soll folgendes Machen: eine Quell und eine Zieldatei. Aus der Quelldatei eine Zeile auslesen, und in die Zieldatei schreiben, aber leicht verändert: jeder Tabulator in der Quelldatei soll ein Semikolon (;) in der Zieldatei sein. Daran beiß ich mir echt die Zähne aus

    Wäre toll, wenn mir jemand helfen könnte. Merke schon, ich habe zu lange kein Delphi mehr gemacht.. (arbeite gerade mit der 6er PE Version, falls das von belang ist)

    Gruß
    André
     
  2. SourceLE

    SourceLE Kbyte

    Registriert seit:
    4. November 2002
    Beiträge:
    488
    Ich hab\'s mir nun schon x-mal Durchgelesen aber irgendwie bekomm ich nicht raus was Du eigentl. Wissen willst.

    Stringlänge ermitteln...
    function Length(S: String): Integer;

    Position bestimmen...
    function Pos(Substr: String; S: String): Byte;

    Teilstring erfassen...
    function Copy(S: String; Index, Count: Integer): String;

    Teilstring einfügen...
    procedure Insert(Source: String; var S: String; Index: Integer);

    Anmerkung (als erste Vorüberlegung zu Verstehen):
    Das Problem Zeichen für Zeichen zu lösen dürfte eine extreme Rechenbelastung sein und wahrscheinl. auch im Code kaum noch verfolgbar sein (wie meinst Du das Chr für Chr?).

    Sinnvoller wäre es den gesamten String inkl. Tab auszulesen, die Pos. der Tabs zu speichern und wieder in den (geänderten) String einzusetzen. Das dürfte mit 2-3 for-schleifen zu machen sein (wenn ich dein Problem richtig verstanden habe).

    MfG

    Nachtrag:
    Ausserdem wäre es vielleicht sinnvoll, sowas wie einen Gültigkeitsbereich festzulegen... Allso alles zwischen 0...9 und A...Z zu erlauben. Der Rest bekommt eine Sonderbehandlung.
    [Diese Nachricht wurde von SourceLE am 15.07.2003 | 00:18 geändert.]
     
  3. Angel-HRO

    Angel-HRO Megabyte

    Registriert seit:
    31. August 2000
    Beiträge:
    2.524
    Hi

    bin nun schon ein ordentliches Stück weiter, danke für die Hilfe. Doch (wie sollte es auch anders sein) stehe ich vor einem neueren Problem. Das mit dem Tabulator hat sich insoweit erledigt, ich löse das nun Zeichen für Zeichen, ist etwas sinnvoller.
    Eine Zeile sieht in etwa so aus:

    12345678 NIKLAS Bench oak 42x42 AB1 ....

    Zwischen der zahl und dem ersten Namen (das letzte AB1 ist ein Auslieferungsland) sind immer Tabulatoren. Problem: der Name hat unterschiedlich viele Zeichen. Wie bekomme ich die Differenz zwischen zeichen[9] (der erste Buchstabe des Namens) und zeichen<I> als letztes zeichen vor dem Tabulator? Oder wie geht das besser? Der Rest ist in jeder Zeile von der Anzahl der Zeichen her gleich.

    Gruß
    André
     
  4. Angel-HRO

    Angel-HRO Megabyte

    Registriert seit:
    31. August 2000
    Beiträge:
    2.524
    Hi

    danke für deine Hilfe, in Testläufen gehen schon ein paar Zeilen, bin aber noch an der Feinabstimmung. Ich hab StringReplace nicht genommen, ist für das Problem doch nicht ideal in meinen Augen.
    Daten: pro Datei (1 Datei pro Woche) müssen (wechselnd) etwa 50-100 Zeilen so bearbeitet werden.

    Hintergrund ist folgender: der betrieb für den ich das schreibe hat in der Vergangenheit immer Verkaufszahlenlisten weltweiter Verkäufe eines nicht unbekannten Möbelhauses (Stichwort: "Wohnst du noch oder lebst du schon"). Dafür wurde mal ein Excel Makro geschrieben, dass dieses unhandliche Format in wundervolles Excel gewandelt hat. Nun ist das unhandliche Format noch unhandlicher geworden, allerdigns nur in der zeichenzahl -abstand. Und dafür schreib ich nen simplen Konverter. Der die vorhandenen daten neu ausliest und im alten Format wiederschreibt, dass eine weiterverarbeitung in Excel erfolgen kann.

    Gruß
    André

    P.S. @SourceLE: danke für den Tip, jetzt sieht es etwas schicker aus :-)
     
  5. SourceLE

    SourceLE Kbyte

    Registriert seit:
    4. November 2002
    Beiträge:
    488
    Ich hab hier nur dein erstes Poblem gelesen (das andere les ich mir noch durch)...

    zu 1) gehe auf PROJECT|OPTIONS|APPLICATION... Load Icon.

    Im übrigen erstellst Du dort auch deine Version\'s-Infos.

    :-)
     
  6. Helkaruthion

    Helkaruthion Byte

    Registriert seit:
    11. April 2003
    Beiträge:
    68
    Hallo nochmal,

    das mit dem Tab hat mich ja denn jetzt doch nochmal interessiert. Vielleicht nimmst du lieber die Funktion StringReplace() aus SysUtils. Das dürfte wesentlich performanter sein als selbst zeichenweise zu arbeiten. Aber das überlasse ich dir... Hab ja keine Ahnung, wieviele Daten du umwandeln mußt.
     
  7. Angel-HRO

    Angel-HRO Megabyte

    Registriert seit:
    31. August 2000
    Beiträge:
    2.524
    Hi

    danke für die Tips. Den Filter hab ich glatt vergessen, eigentlich peinlich, also Schwamm drüber :-)

    Also Datei öffnen, zeilenweise einlesen, etc, alles kein Thema. Mir ging es darum aus dem String die Tabulatoren in Semikolons zu wandeln. Dein kurzer Quellcode hilft mir sehr weiter, danke schön

    Einzig das proiblem mit dem Programmsymbol... ist aber eigentlich acuh nicht schlimm...

    Gruß
    André
     
  8. Helkaruthion

    Helkaruthion Byte

    Registriert seit:
    11. April 2003
    Beiträge:
    68
    Hi!

    Hab was für dein zweites Problem:
    Du muss die Eigenschaft "Filter" des TOpenDialog verändern und zwar so...
    z.B. Textdateien|*.txt|CSV-Dateien|*.csv
    Der erste Wert gibt an, welche Beschriftung in dem Feld des Dialogs stehen soll, der zweite das Suffix. Willst du mehrere Auswahlmöglichkeiten haben, dann hängst du die wie im Beispiel einfach an. In der Form wie es da steht, bewirkt es, dass du auch tatsächlich nur diese beiden Filter "Textdateien" und "CSV-Dateien" setzen kannst und nicht noch *.

    Was das dritte angeht:
    Lies in der Online-Hilfe nach, wie man ne Datei auf macht. Simpel... Danach liest du zeilenweise, das liefert dir nen String. Mit dem machst du dann deine Aktionen. In dem Fall vielleicht einfach zeichenweise durchlaufen und die Tabs durch ein Semikolon austauschen.
    Irgendwie so:
    for i:=0 to length(zeile)-1 do
    if zeile\[i\]=(Ascii-Code für den Tab) then zeile\[i\]:=";";
    (natürlich ohne die Backslashes, aber anders erschien keine eckige Klammer :-))

    Anschließend schreibst du deinen String einfach in die zweite Datei, die du genau wie die erste im Programm geöffnet hast.
    Sollte aus dem Stand funktionieren...

    Falls nicht, schick einfach ne Mail, dann such ichs mal genauer raus.

    Gruß
    [Diese Nachricht wurde von Helkaruthion am 30.06.2003 | 12:56 geändert.]
    [Diese Nachricht wurde von Helkaruthion am 30.06.2003 | 12:57 geändert.]
     
Status des Themas:
Es sind keine weiteren Antworten möglich.

Diese Seite empfehlen