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:string; var rpAusgabeSoll:string; var 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; tmpStr := ''; inc(nr); inc(k); end; if (nr < 1) or (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 < 1) or (nr > 3) or (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
jasocul: 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
jasocul 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;
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:string; var rpAusgabeSoll:string; var 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); lboxumsatz.Items.Add(StrExpand(tmpMonat,9)+'|'+StrExpand(tmpSoll,8)+'|'+StrExpand(tmpIst,9)); 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
Christian 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
HammerHai 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...
HammerHai 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!