Entwickler-Ecke

Sonstiges (Delphi) - Datei einlesen, in listbox ausgeben, richtig formatieren!SOS


HammerHai - Mi 31.10.07 10:53
Titel: Datei einlesen, in listbox ausgeben, richtig formatieren!SOS

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:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
var
  frmUmsatz: TfrmUmsatz;
const TRENNZEICHEN =';';
implementation

{$R *.DFM}

var
  FilePath :String;
  tmpStringList :TStrings;

function EinlesenDaten(pEingabeStr:string; pTrennzeichen:char; var rpAusgabeMonat:stringvar rpAusgabeSoll:stringvar rpAusgabeIst:string) :boolean;
var
  k, nr :integer;
  tmpStr :string;
begin
try
  Result := true;
  nr := 1;
k := 0;
repeat
  inc(k);
  if (pEingabeStr[k] = pTrennzeichen) or (k = length(pEingabeStr)+1)
        then
          begin
            case nr of
              1: rpAusgabe ##:= tmpStr;
               2: rpAusgabe ## := tmpStr;
              3: rpAusgabe ## := tmpStr;
            end// of case
            tmpStr := '';
            inc(nr);
           inc(k);
          end;
      if (nr < 1or (nr > 4)
        then
          begin
            MessageDlg('Fehler!'+#13+'Die Datei ist zerstört!'+#13+'Der Vorgang wird abgebrochen!', mtError, [mbOK], 0);
            exit;
          end;
      tmpStr := tmpStr + pEingabeStr[k];
until ((nr < 1or (nr > 3or (k = length(pEingabeStr)+1));

except
  Result := false;
end;

end;

function EinlesenDatei(pFilePath:string)  :boolean;
begin
try
  Result := true;
  tmpStringList.LoadFromFile(pFilePath);
except
  Result := false;
end;
end;

procedure Tfrm#####.btnSchobClick(Sender: TObject);
var
  k :integer;
  tmpStr, tmp##, tmpSoll, tmpIst :string;
begin
FilePath:='Pfad';
if EinlesenDatei(FilePath)
  then
    begin
      lboxUmsatz.Clear;
      lboxUmsatz.Items.Add('  ###### |  ####  |  #######');
      lboxUmsatz.Items.Add('---------|--------|---------');
        for k := 0 to tmpStringList.Count-1 do
          begin
            tmpStr := tmpStringList.Strings[k];
            EinlesenDaten(tmpStr, TRENNZEICHEN, tmpMonat, tmpSoll, tmpIst);
            lboxumsatz.Items.Add(tmpMonat+'    | '+tmpSoll+'    |'+tmpIst);
          end;
    end
else
  MessageDlg('Fehler!'+#13+'Es trat ein Fehler bei der DatenVerarbeitung auf!'+', mtError, [mbOk], 0);
end;




procedure TfrmUmsatz.btnAdlerClick(Sender: TObject);
var
  k :integer;
  tmpStr, tmp####, tmp###, tmp### :string;
begin
FilePath:='
Pfad';
if EinlesenDatei(FilePath)
  then
    begin
      lboxUmsatz.Clear;
      lboxUmsatz.Items.Add('
  #####  |  #####  | ####   ');
      lboxUmsatz.Items.Add('
---------|--------|---------');
        for k := 0 to tmpStringList.Count-1 do
          begin
            tmpStr := tmpStringList.Strings[k];
            EinlesenDaten(tmpStr, TRENNZEICHEN, tmpMonat, tmpSoll, tmpIst);
            lboxumsatz.Items.Add(tmpMonat+'
    | '+tmpSoll+'    |'+tmpIst);
          end;
    end
else
  MessageDlg('
Fehler!'+#13+'Es trat ein Fehler bei der DatenVerarbeitung auf!'+', mtError, [mbOk], 0);
end;


procedure TfrmUmsatz.FormActivate(Sender: TObject);
begin
tmpStringlist := TStringList.Create;
FilePath := '1123';

end;

procedure TfrmUmsatz.FormDestroy(Sender: TObject);
begin
tmpStringList.Free;
end;

procedure TfrmUmsatz.btnHygieClick(Sender: TObject);

var
  k :integer;
  tmpStr, tmpMonat, tmpSoll, tmpIst :string;
begin
FilePath:='Pfad';
if EinlesenDatei(FilePath)
  then
    begin
      lboxUmsatz.Clear;
      lboxUmsatz.Items.Add('  #####  |  ####  |  ########');
      lboxUmsatz.Items.Add('---------|--------|---------');
        for k := 0 to tmpStringList.Count-1 do
          begin
            tmpStr := tmpStringList.Strings[k];
            EinlesenDaten(tmpStr, TRENNZEICHEN, tmpMonat, tmpSoll, tmpIst);
            lboxumsatz.Items.Add(tmpMonat+'    | '+tmpSoll+'    |'+tmpIst);
          end;
    end
else
  MessageDlg('Fehler!'+#13+'Es trat ein Fehler bei der DatenVerarbeitung auf!'+, mtError, [mbOk], 0);
end;


procedure TfrmUmsatz.btnSoftwareClick(Sender: TObject);

var
  k :integer;
  tmpStr, tmpMonat, tmpSoll, tmpIst :string;
begin
FilePath:='Pfad';
if EinlesenDatei(FilePath)
  then
    begin
      lboxUmsatz.Clear;
      lboxUmsatz.Items.Add('  #####  |  ####  |   ###   ');
      lboxUmsatz.Items.Add('---------|--------|---------');
        for k := 0 to tmpStringList.Count-1 do
          begin
            tmpStr := tmpStringList.Strings[k];
            EinlesenDaten(tmpStr, TRENNZEICHEN, tmpMonat, tmpSoll, tmpIst);
            lboxumsatz.Items.Add(tmpMonat+'    | '+tmpSoll+'    |'+tmpIst);
          end;
    end
else
  MessageDlg('Fehler!'+#13+'Es trat ein Fehler bei der DatenVerarbeitung auf'!+', mtError, [mbOk], 0);
end;


end.



Moderiert von user profile iconjasocul: Topic aus Dateizugriff verschoben am Mi 31.10.2007 um 10:46


Agawain - Mi 31.10.07 10:59

Hi, erstmal

:welcome:

Das finde ich jetzt mal extrem lustig :mrgreen:

Die meisten lassen es hier an Erläuterungen und Quelltext fehlen und wenn, bekommt man maximal soviel Quelltext zu sehen, dass man da auch nicht viel mit anfangen kann.

Aber jetzt nur Quelltext, das ist mal was Neues :wink:

Wäre nett, wenn Du mal schreiben könntest, worum es Dir geht.


HammerHai - Mi 31.10.07 11:24

hallo thx.

also mir gehts um das einlesen einer text datei und die ausgeben in eine Listbox. das hab ich auch mit diesem Quellcode(siehe oben) geschafft aber, ich will das noch richtig formatieren, dass alles untereinander steht z.b.

Name______Nachname
yxc________yxcycxy
yxc________rtgadfhg
afsssad____dgfadfg
werwtevx___fdhgsdfg

so sollte es aussehen aber bei mir sieht des so aus:

name nachname
yxc__yxcycxy
yxc_rtgadfhg
afssad__dgfadfg
werwtevx__fdhgsdfg

__ = abstand!

versteht ihr mein prob???


jasocul - Mi 31.10.07 11:43

Ohne jetzt Deinen Quelltext zu lesen, würde ich Dir folgenden Ansatz vorschlagen:
1. Stelle sicher, dass Du eine Schrift nimmst, die nicht proportional ist (z.B. Courier).
2. Schreibe Dir eine kleine Funktion, die Dir vor dem zweiten Wort entsprechend viele Füllzeichen einfügt werden, damit der Abstand stimmt. Dafür sollten die Routinen Pos und insert genügen.

Und ändere bitte den Titel Deines Topics. Denn der jetzige beschreibt ja gar nicht Dein Problem.


JoelH - Mi 31.10.07 11:50

Du zerlegst doch den String irgendwie und fügst ihn dann wieder zusammen. Vor diesem Zusammenfügen musst du prüfen wie lang der Teilstring "name" ist. Ist er kürzer wie x, dann musst die die Differenz an Zeichen zwischen x und length(name) einfach bei name anhängen. Um es mal "sprachlich" zu "programmieren".


HammerHai - Mi 31.10.07 12:07

kk. könnt ihr mir en quellcode schreiben weil ich noch en noob bin pls oder halt helfen.


jasocul - Mi 31.10.07 12:17


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Function StrExpand (oldStr : String; NewLen : Integer) : String;
begin
  if Length(oldStr) > NewLen then
  begin
    oldStr := copy(oldStr, 1, NewLen);
  end;
  while Length(oldStr) < NewLen do
  begin
    oldStr := oldStr + ' ';
  end;
  Result := oldStr;
end;

Auf die Schnelle und ungeprüft.


HammerHai - Mi 31.10.07 12:28

warum muss ich die unproportionalen schriften nehmen?


jasocul - Mi 31.10.07 12:59

Starte mal Deine Textverarbeitung.

Schreibe dann 20 mal "i" in eine Zeile. In die nächste schreibst Du 20 mal "m".
Formatiere den Text einmal mit proportionaler Schrift und dann mit einer nicht-proportionalen Schrift.

Vergleiche das Ergebnis.

Du wirst feststellen, dass bei proportionaler Schrift die Zeichenbreite für jedes Zeichen anders sein kann. Das ist aber bei Deinem Vorhaben sehr störend. Ich denke, man kann das Problem auch mit Proportionalschrift lösen, aber das dürfte deutlich über Dein Niveau hinaus gehen (ist nicht böse gemeint).


HammerHai - Mi 31.10.07 13:01

kk thx dann mal.

ich hab folgendes prob.

in meiner list box steht(sieht anhang)

ich will aber dass alles schön untereinander ist. geordnet!


HammerHai - Mi 31.10.07 13:04

user profile iconjasocul hat folgendes geschrieben:
Starte mal Deine Textverarbeitung.

Schreibe dann 20 mal "i" in eine Zeile. In die nächste schreibst Du 20 mal "m".
Formatiere den Text einmal mit proportionaler Schrift und dann mit einer nicht-proportionalen Schrift.

Vergleiche das Ergebnis.

Du wirst feststellen, dass bei proportionaler Schrift die Zeichenbreite für jedes Zeichen anders sein kann. Das ist aber bei Deinem Vorhaben sehr störend. Ich denke, man kann das Problem auch mit Proportionalschrift lösen, aber das dürfte deutlich über Dein Niveau hinaus gehen (ist nicht böse gemeint).



nene hasch scho recht. ich bin net de beste im Proggen.

des isch hart mit dene schriften, des hab ich jetzt net gewusst!


HammerHai - Mi 31.10.07 13:11

des trennen hab ich von jemand gehört kann man auch mit Splitt irgentwas machen. oder wie geh i ch da vor ich hab keine ahnung und bin am verzweifeln.


jasocul - Mi 31.10.07 13:20

Wenn Du in Zeile 76 Deines oben eingetragenen Quelltextes meine Funktion (s.o.) einbaust. solltest Du ein akzeptables Ergebnis bekommen.


HammerHai - Mi 31.10.07 13:41

hab ich probt aber kommt fehler:

[Error] SollistumsatzU.pas(134): Statement expected but 'FUNCTION' found


ich kann doch keine function in eine procedur schreiben oder??

also ich mein so :

procedure ................

.
.
.

Function StrExpand (oldStr : String; NewLen : Integer) : String;
.
.
.
.

end;


uko - Mi 31.10.07 13:51

Doch, in gewissen Sinne schon:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure bla;
  function DoBla: string;
  begin
    ... code von DoBla
  end;
begin
  ... code von bla
end;


Grüße,
Uli


jasocul - Mi 31.10.07 14:05

@uko:
Das ist zwar korrekt, aber führt am Thema vorbei.

@HammerHai:
Du hast doch in Deinem Programm schon eine eigene Funktion geschrieben (EinlesenDaten) und benutzt sie auch. Dann sollte es doch kein Problem sein, eine weiter Funktion einzubauen.


HammerHai - Mi 31.10.07 14:33

nun ja ich kappier grad nix mehr. einer hat gesagt mit ner split function gibts sowas überhaupt in delphi. ich weiss nicht mehr weiter. sitz jetzt seit 5stunden an diesem rotz.

@jasocul: wie schon gesagt wenn ich die funktion da einfüge un dann de debugger starten will kommten en haufen fhler kannst nich du das mal kurz einbauen und dann posten ich ver steh das nich wie du das meinst.

oder kann das jemand anderes jasocul´s function kurz in den quelltext einbauen und ann wieder posten.


bitte um hilfe.


jasocul - Mi 31.10.07 14:50

SPLIT:
Es gibt etwas in der Art: Einlesen in eine StringList als DelimitedText. Aber da Dein Source bis auf das eine Problem läuft, solltest Du es erstmal beim jetzigen Stand belassen.

Source:

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:
var
  frmUmsatz: TfrmUmsatz;
const TRENNZEICHEN =';';
implementation

{$R *.DFM}

var
  FilePath :String;
  tmpStringList :TStrings;

// Hier einbauen:
Function StrExpand (oldStr : String; NewLen : Integer) : String;
begin
  if Length(oldStr) > NewLen then
  begin
    oldStr := copy(oldStr, 1, NewLen);
  end;
  while Length(oldStr) < NewLen do
  begin
    oldStr := oldStr + ' ';
  end;
  Result := oldStr;
end;

function EinlesenDaten(pEingabeStr:string; pTrennzeichen:char; var rpAusgabeMonat:stringvar rpAusgabeSoll:stringvar rpAusgabeIst:string) :boolean;
...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
      lboxUmsatz.Clear;
      lboxUmsatz.Items.Add('  ###### |  ####  |  #######');
      lboxUmsatz.Items.Add('---------|--------|---------');
        for k := 0 to tmpStringList.Count-1 do
          begin
            tmpStr := tmpStringList.Strings[k];
            EinlesenDaten(tmpStr, TRENNZEICHEN, tmpMonat, tmpSoll, tmpIst);
// Hier Änderung:     
       lboxumsatz.Items.Add(StrExpand(tmpMonat,9)+'|'+StrExpand(tmpSoll,8)+'|'+StrExpand(tmpIst,9));
// Evtl. die Zahlen für die Länge anpassen. Ich könnte mich verzählt haben.
          end;


Ich habe jetzt nur Code-Ausschnitte aus Deinem Source verwendet. Aber ich hoffe, Du findest Dich zurecht.

Um dich mit den Delphi-Grundlagen vertraut zu machen, empfehle ich dir den Crashkurs [http://www.christian-stelzmann.de/index-tutorials-crashkurs.html] von user profile iconChristian S..


HammerHai - Mi 31.10.07 15:42

es funzt thx an alle.


ich hab aber ein weiteres prob und zwar die bündigkeit links/rechtsbündig und die formatierung wie tausendertrennzeichen und auf zwei stellen runden.


pls help


jaenicke - Mi 31.10.07 15:52

user profile iconHammerHai hat folgendes geschrieben:
ich hab aber ein weiteres prob und zwar die bündigkeit links/rechtsbündig
Wenn du die Funktion StrExpand verstanden hättest, dann wäre das kein Problem für dich das entsprechend zu ändern... :roll:
Wenn dir was unklar ist, dann frag bitte nach...

user profile iconHammerHai hat folgendes geschrieben:
und die formatierung wie tausendertrennzeichen und auf zwei stellen runden.
Eine neue Frage gehört nicht in den selben Thread, die Forensuche sollte dir da schon helfen, ansonsten erstelle bitte einen neuen Thread für die Frage.


jasocul - Mi 31.10.07 16:10

Hallo,

bitte erstelle für jede deiner Fragen ein separates Topic, da die Diskussion mehrerer Fragen in einem Topic für gewöhnlich für Verwirrung und Durcheinander sorgt. Daher:

*geschlossen*


Viele Grüße,
Jasocul