Autor Beitrag
Uliversum63
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 18.11.09 17:34 
Hallo Delphi-Freunde!

Will es kurz machen:

Mit dem Befehle readln(datei,zeile) kann ich eine einzelne Zeile nicht einlesen;
Anders als bei TP werden auch Zeichen nach dem Zeilenende gelesen??

Wordpad zeigt die Datei mit exaktem Zeilenumbruch an.

Zudem erscheinen in der Listbox überall da Hyroglyphen,
wo Umlaute oder 'ß' stehen sollten.

Meine Fragen wären:

1) Gibt es eine andere Möglichkeit des Zeilenauslesens?
- Mit read klappt es zwar, ist aber umständlich.

2) Beherrscht die Listbox nicht ohne Weiteres den entspr. Zeichensatz?

Habe in meinen Büchern- "GoTo Delphi 6" und "Delphi 6 in Team" nichts darüber finden können.

DANKE Euch im Voraus!!!
Uli

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Nochmal ich:

Leider funktioniert meine Delphi-Hilfe überhaupt nicht!
Kommt sofort eine Error-Box.
Die Delphi 6-CD stammt aus einem Buch "Delphi for Kids 2"
Auch nach erneuter Install. keine Hilfe. Shit
Critter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 328
Erhaltene Danke: 3

Windows 7
Delphi 7 Pro.
BeitragVerfasst: Mi 18.11.09 18:04 
Hallo,

wenn es darum geht den Text nur in eine Listbox zu bekommen, dann kannst du ihn auch direkt per ListBox1.Lines.LoadFromFile('Filename') laden.
Was die Codierung angeht ist es gut möglich, das die Delphi Komponenten diese nicht von Haus aus unterstützen, Delphi beherrscht z.B. erst in der neuesten Version Unicode Zeichensätze.

Du solltest hier im Forum viele Beiträge dazu finden. Einfach mal nach Unicede, UTF8, UTF16 usw. suchen. Je nachdem wie deine Datei geartet ist ;).

critter

_________________
Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 19.11.09 01:57 
user profile iconUliversum63 hat folgendes geschrieben Zum zitierten Posting springen:
Leider funktioniert meine Delphi-Hilfe überhaupt nicht!
Du hast nicht zufällig Vista?
www.delphi-library.d...ewtopic.php?p=544403
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Do 19.11.09 09:05 
Hallo,

user profile iconUliversum63 hat folgendes geschrieben Zum zitierten Posting springen:
....
1) Gibt es eine andere Möglichkeit des Zeilenauslesens?
- Mit read klappt es zwar, ist aber umständlich...


user profile iconLannes hat folgendes geschrieben Zum zitierten Posting springen:
...Alternativ können auch beim Programmstart, z.B. in OnCreate der Form, mit der folgenden Codezeile die Einträge aus einer Text-Datei geladen werden :
ausblenden Delphi-Quelltext
1:
ListBox1.Items.LoadFromFile('C:\Temp\IrgendEinName.txt');					

:gruebel: :les:
Ps.: manchmal fragt man sich warum man was schreibt, wenn es eh nicht gelesen wird.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Uliversum63 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: So 22.11.09 20:15 
Hallo Critter!

Dein Tip ist schon mal prima! In den einzulesenden Zeilen meiner Datei sind allerdings Datum, Uhrzeit, Tel.Nr. enthalten, alles fortlaufend formatiert.

Mit dem von Dir vorgeschlagenen Befehl kann ich wohl alle Zeilen in die ListBox einlesen, und es werden auch alle Zeilen mit CR abgeschlossen, doch möchte ich die o.g. Daten gerne getrennt ausgeben.

Die Formatierungen rausschmeißen. Denke, das muß ich wohl doch über readln machen und dann alles zerlegen.


Hallo jaenicke!

Ne, ich habe xp. Und trotzdem keine Hilfe.

DANKE EUCH ALLEN!!!

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
JoelH
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
BeitragVerfasst: Di 24.11.09 08:13 
Wie jetzt? Willst du die Zeilen in einen Listbox einlesen oder nicht?

Wie ist denn so eine Zeile genau aufgebaut, welches Trennzeichen wird verwendet? Gib mal ein Beispiel.

Anscheinend magst du wo eine Zeile einlesen und dann nach einem bestimmten Trennzeichen in diverse "Zeilen" aufspalten oder wie?

Folgender Code liest eine TAB-getrennte Textdatei ein und schreibt die Items in eine Listbox. Leider klappt der Dateiupload nicht, ansonsten hätt ich das Projekt angehängt.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    function nextitem( var s_Text : String;var rueckgabe: string): boolean;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

const C_TRENNZEICHEN = #9;   //Trennzeichen  hier TAB

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var sl : TStringlist;
    i : Integer;
    s, s2 : String;
begin
  if opendialog1.execute then
  begin
    sl := TStringlist.Create;
    sl.clear;
    sl.LoadFromFile(opendialog1.FileName);
    for i := 0 to sl.Count - 1 do
    begin
      s := sl.Strings[i];
      repeat
        if nextitem(s,s2) then
          listbox1.Items.add(s2);
      until s='';
    end;

  end;

end;

function TForm1.nextitem( var s_Text : String;var rueckgabe: string): boolean;
var trennposition : Integer;
    itemfound : boolean;
begin
  itemfound := false;                                             // Neues Item gefunden?
  trennposition := POS(C_TRENNZEICHEN,s_Text);                    // Trennzeichen in Zeile?
  if POS(C_TRENNZEICHEN,s_Text) > 0 then                          // Trennzeichen gefunden!
  begin
    itemfound  := true;
    rueckgabe := COPY(s_text,1,trennposition-1);                  // Item zurückgeben
    if trennposition < length(s_Text) then
      s_Text := COPY(s_Text,trennposition+1, length(s_text))      // Item ausschneiden
    else
      s_Text := '';
  end
  else                                                            // kein Trennzeichen gefunden, aber der Satz muss ja nicht zuende sein.
  begin
    if length(s_text) > 0 then                                    // Den Rest einlesen
    begin
      itemfound := true;
      rueckgabe := s_Text;
      s_Text := '';
    end;
  end;
  result := itemfound;
end;

end.

_________________
mfg. Joel
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Di 24.11.09 13:34 
Hey,

das würde ich dir so nich empfehlen, weil ich mir so mal mein komplettes Programm geschrottet hab un ewig nach dem Fehler suchen musste. Der fehler war dann das ganze rum kopieren der Strings...
machs doch so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure StrToList(str: String; List: TListBox);
var j: Integer; //Zählervariable 
var CurrentItem: String;
const TRENNZEICHEN = #9//Tabulator
begin
  j := 1;
  CurrentItem := '';
  while j < Length(str) do begin //alle zeichen durchzählen
    if str[j] <> TRENNZEICHEN then begin //wenn nicht das trennzeichen
      CurrentItem := CurrentItem + str[j]; //dann das zeichen in nem andern String speichern
    end else begin //wenn das trennzeichen
      List.Items.Add(CurrentItem); //anderen String zur Liste hinzufügen
      CurrentItem := ''
    end;
    inc(j); //nächstes zeichen
  end;
  if Length(CurrentItem) <> 0 then //wenn noch was in dem String steht 
    List.Items.Add(CurrentItem); //zur Liste hinzufügen
end;


@Lannes: ich seh dein Post gar nich oO

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Mi 25.11.09 08:32 
Also ich steige da jetzt leider noch nicht so ganz durch, aber ich finde hier jetzt noch nicht die Standard-Lösung, das ganze erst mal in ein normales Memo zu laden und von da weiter auszulesen:
ausblenden Delphi-Quelltext
1:
MemoEinzulesendeDatei.Lines.LoadFromFile(OpenDialog1.FileName);					

Damit hättest Du zwar noch wieder eine (versteckare) visuelle Komponente mehr, von der ich aber immer denke, dass dadurch das Ganze übersichtlicher wird - zumal Du damit zur Probelaufzeit siehst, was darin abläuft, wenn Du sie noch auf Visible=True hast.

Und ich meine, dass Du dann doch nachher einfach
ListBox1.Items:=MemoEinzulesendeDatei.Lines
machen kannst.


...oder bin ich da jetzt gerade "auf dem Holzweg"?


Zuletzt bearbeitet von ffgorcky am Mi 25.11.09 08:37, insgesamt 1-mal bearbeitet
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Mi 25.11.09 08:36 
Hey,

wir wissen ja nich wie seine Daten aussehen... Un den vorschlag das ganze in ne ListBox zu laden kahm ja schon.
Das mit dem Memo zur Übersicht is ne gute Idee, wenn man das nachverfolgen will, da müsste man aber auch noch n Timer oder sowas einbauen, wenn man das wirklich verfolgen will, sonst flimmert es nur kurz un das neue Ergebnis steht ihm Memo ;)

MfG Bergmann

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 25.11.09 10:02 
user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
Damit hättest Du zwar noch wieder eine (versteckare) visuelle Komponente mehr, von der ich aber immer denke, dass dadurch das Ganze übersichtlicher wird - zumal Du damit zur Probelaufzeit siehst, was darin abläuft, wenn Du sie noch auf Visible=True hast.
Solange man die danach durch eine TStringList ersetzt und nicht einfach nur die Komponente versteckt, ist das ja ok. Man kann dann auch ShowMessages z.B. einbauen um die Schritte erst bei Klick darauf fortzusetzen, dann sieht man was passiert. (Eigentlich eignet sich der Debugger dafür aber deutlich besser...)

Was die Performance angeht: die ist beim Test mit der Komponente dann natürlich extrem langsamer als später mit der TStringList, das hat da nicht so viel zu sagen.

Ach ja: Was die Umlaute usw. angeht. Da werfe ich einmal OemToChar und CharToOem in den Raum. Ich vermute die Datei ist als DOS-Datei gespeichert, dann kann man das damit umwandeln.
Critter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 328
Erhaltene Danke: 3

Windows 7
Delphi 7 Pro.
BeitragVerfasst: Mi 25.11.09 14:08 
Hi,

keine Ahnung wie es den anderen geht, aber ich finde den Thread hier mittlerweile sehr verwirrend. Daher möchte ich dich user profile iconffgorcky bitten hier ein wenig Ordnung rein zu Bringen. Schön währe wenn du ein mal ein paar Zeilen aus der Import Datei hier posten könntest, damit wir anderen uns auch einen Eindruck von der Zeilenstruktur machen können. Ferner währe dann noch schön, wenn du beschreiben könntest, welchen Teil der jeweiligen Datenzeile du wo hin haben willst, Also z.B. die Nummer an Anfang in ListBox1, den String am Ende in ListBox2 und alles dazwischen kann ignoriert werden oder so.

Ich denke mit den Infos kann dir dann viel gezielter geholfen werden.

critter

_________________
Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
Uliversum63 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Sa 28.11.09 23:30 
Hallo Leute!

Danke Euch erstmal für die vielen Beiträge!
Im letzten wurde etwas treffendes erwähnt: der Thread ist mittlerwelie eher verwirrend geworden.

Inzwischen habe ich alles zerlegt, in Nummer, Datum, Uhrzeit usw. aufgegliedert und formatiert ausgegeben.
Soweit, Sogut.

Mir geht es 'nur' noch um die Entfernung der Hyroglyphrn!
Konnte bisher nichts hilfreiches dazu finden.

Hier ein Auszug aus der Quelldatei:

4917785033275";"";"";"2009.10.25 21:02";"";"Mußt Du denn morgen Frühschicht machen? Können ja noch telefonieren.

Das <Mußt> und <Frühschicht> und <Können> sind mit Hyroglyphen dargestellt,
die ich jetzt nicht so leicht nachstellen kann.

Die Formatierungen sind kein Problem, NUR die Umlaute und 'ß'.
Ist mir unbegreiflich, bei Delphi 2009!

Gruß Uli
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Sa 28.11.09 23:41 
Woher kommt die Datei denn? Welches programm schreibt die?
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: So 29.11.09 00:16 
Ich habe den Verdacht, das könnte ein Ascii/Ansi-Problem sein. 8) Selbst ohne zu wissen, wo die Daten genau herkommen :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
function AsciiToAnsi(s: string): string;
var
  i: integer;
  st : string;
begin
  st := '';
  if length (s) > 0 then begin
    for i := 0 to Length(s) do begin
      if s [i] <> #0 then begin
        case s[i] of
          #142: st := st + #196//Ä
          #153: st := st + #214//Ö
          #154: st := st + #220//Ü
          #132: st := st + #228//ä
          #148: st := st + #246//ö
          #129: st := st + #252//ü
          #225: st := st + #223//ß
          else
            st := st + s[i];
        end;
      end;
    end;
  end;
  AsciiToAnsi := st;
end;


Einfach mal ausprobieren. Lasse die Funktion mal auf dein <Frühschicht>, aber nicht das hier sondern das mit den "Hyroglyphen" los.

_________________
Gruß
Hansa
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 29.11.09 01:15 
Genau das (wenn es bei dir die DOS-Zeichencodes sind) machen die Funktionen aber auch schon ohne das manuell zu machen: ;-)
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ach ja: Was die Umlaute usw. angeht. Da werfe ich einmal OemToChar und CharToOem in den Raum. Ich vermute die Datei ist als DOS-Datei gespeichert, dann kann man das damit umwandeln.
Uliversum63 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: So 29.11.09 20:05 
Da bin i wieder!
Hallo Delphi-Freunde!

Ja, des mit der case-Anweisung hatte ich schon vor, verstehe auch, wie das ablaufen muß. Doch hab ich die Idee noch nicht umgesetzt, denn für einen(!) Umlaut oder 'ß' stehen 2(!) Hyroglyphen. Müsste demnach die case-Anweisung verschachteln oder mit:
ausblenden Delphi-Quelltext
1:
if (erster Hyroglyph=dieses) and (zweiter Hyroglyph=jenes) dann 'ß' ..					
Es ist sicher alles machbar, mehr oder weniger zu Fuß. Ich kenne das von TP7. Aber ob es für all das nicht eine logische Erkärung gibt? Das modernste Delphi- aber kein erw. Zeichensatz??

Ich denke, ich versuche es noch etwas mit dem guten-alten-zu-Fuß-gehen.

Das Prog schreibe ich einfach für mich u. meine Freundin und so kommt es nicht so sehr darauf an.

DANKE EUCH SEHR!!!

Melde mich, wenn eine Lösung gefunden!

Gruß Uli!!

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 29.11.09 22:35 
user profile iconUliversum63 hat folgendes geschrieben Zum zitierten Posting springen:
denn für einen(!) Umlaut oder 'ß'
stehen 2(!) Hyroglyphen.
Dann versuche es einmal mit Utf8ToAnsi, Utf8Encode, usw. z.B., denn ich vermute, dass dann die Datei eine Unicodedatei ist. Schau einmal in einem Hexeditor an, ob am Anfang der Datei eine Unicodesignatur steht.
Uliversum63 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 01.12.09 12:08 
Hallo jaenicke!

Habe inzwischen so ziemlich alle Hyrogl. verarbeiten können(case of), so daß fast alles korrekt dargestellt wird, 'nur' noch das gr. Ü u. gr. Ä, aber es ist zum Haare raufen, wenn ich bedenke, was Delphi für ein mächtiges und modernes Entw.-System ist und dann sowas.

Wenn es sich um einen Bug handeln sollte, gibt es dafür doch sicher einen Patch im Inet?

Wie in einem meiner anderen Themen beschrieben(da habe ich auch Quellcode drin), würde ich die Datei gerne so verarbeiten, wie sie daher kommt, ohne daß ich als Anwender vorher die Dat. im Unicode abspeichern muß.

Es gibt sicher die Möglichkeit, per code die Dat. im Unicode zu speichern u. dann zu verarbeiten. Aber ich habe bisher nur Dateien geöffnet u. gespeichert, aber nicht als Unicode.

Gruß Uli

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Di 01.12.09 13:38 
Hey,
user profile iconUliversum63 hat folgendes geschrieben Zum zitierten Posting springen:
Wenn es sich um einen Bug handeln sollte, gibt es dafür doch sicher einen Patch im Inet?

Ich glaub nich, dass das ein Bug ist, er zeigt halt nur an was du ihm zu fressen gibts ;) der PC kann ja nich wissen, wie die Daten formatiert sind, das musst du ihm schon sagen...

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^