| Autor |
Beitrag |
arminho
      
Beiträge: 59
|
Verfasst: Mi 09.03.05 19:56
hallo leute, habe leider keine ahnung wie ich das hier schaffen soll...:
habe eine .txt-datei die so aussieht:
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:
| Name Age Nat St Tk Ps Sh Ag KAb TAb PAb SAb Gam Sav Ktk Kps Sht Gls Ass DP Inj Sus ------------------------------------------------------------------------------------------- R_Ajnke 27 deu 10 2 3 3 13 300 300 300 300 0 0 0 0 0 0 0 0 0 0 F_Jurik 31 aus 7 2 1 3 11 300 300 300 300 0 0 0 0 0 0 0 0 0 0 D_Huis 21 deu 7 1 2 1 14 300 300 300 300 0 0 0 0 0 0 0 0 0 0 Veinic 24 ita 1 9 2 1 14 300 300 300 300 0 0 0 0 0 0 0 0 0 0 D_Zartew 32 pol 1 8 4 2 22 300 300 300 300 0 0 0 0 0 0 0 0 0 0 D_Dibi 26 sen 2 7 3 3 21 300 300 300 300 0 0 0 0 0 0 0 0 0 0 S_Cheronda 25 usa 2 9 2 2 28 300 300 300 300 0 0 0 0 0 0 0 0 0 0 T_Stundbar 32 deu 2 8 5 3 33 300 300 300 300 0 0 0 0 0 0 0 0 0 0 M_Larozat 35 deu 1 10 2 3 21 300 300 300 300 0 0 0 0 0 0 0 0 0 0 P_Meartze 20 deu 1 11 7 2 25 300 300 300 300 0 0 0 0 0 0 0 0 0 0 G_Xadre 22 tur 1 5 3 4 34 300 300 300 300 0 0 0 0 0 0 0 0 0 0 M_Sjugel 23 deu 2 5 4 3 30 300 300 300 300 0 0 0 0 0 0 0 0 0 0 C_Dinovic 26 deu 1 3 9 3 17 300 300 300 300 0 0 0 0 0 0 0 0 0 0 M_Vaduhalib 24 sen 1 2 9 3 17 300 300 300 300 0 0 0 0 0 0 0 0 0 0 A_Ctredin 29 deu 1 4 10 3 29 300 300 300 300 0 0 0 0 0 0 0 0 0 0 R_Ilfmann 25 por 2 6 11 4 31 300 300 300 300 0 0 0 0 0 0 0 0 0 0 T_Sauber 19 sui 1 4 9 5 29 300 300 300 300 0 0 0 0 0 0 0 0 0 0 N_Kastrev 31 scg 2 3 10 3 16 300 300 300 300 0 0 0 0 0 0 0 0 0 0 D_Stuiner 31 cro 1 7 8 1 34 300 300 300 300 0 0 0 0 0 0 0 0 0 0 V_Babatus 27 deu 1 5 8 3 22 300 300 300 300 0 0 0 0 0 0 0 0 0 0 J_Ifolzake 23 can 1 2 9 4 26 300 300 300 300 0 0 0 0 0 0 0 0 0 0 S_Dainemann 25 deu 1 3 8 2 34 300 300 300 300 0 0 0 0 0 0 0 0 0 0 |
jetzt will ich, dass er die daten der reihe nach in ein StringGrid lädt... also den ersten Namen R_Ajnke in Feld [1,1], sein Alter "27" in [2,1] etc.
kann einer helfen?
Moderiert von Tino: Code-Tags hinzugefügt.
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 09.03.05 20:06
Das ist doch nicht viel anders als dein letztes Problem. Sind sogar die selben Daten. Das sieht jetzt aber sehr nach Info-Aufgabe aus. Erst die ComboBox lernen, dann ein StringGrid.
Hast du dich denn schon mit der TStringGrid-Komponente auseinandergesetzt?
Du brauchst doch im Grunde die gleichen String-Funktionen, wie in der letzten Aufgabe.
Aus dem StringGrid benötigst du RowCount, Cells und ColWidth. Schau dir das mal in der OH an.
|
|
arminho 
      
Beiträge: 59
|
Verfasst: Mi 09.03.05 21:53
welche letzte aufgabe meinst du denn?
mit dem hier vielleicht (natürlich erst umgeformt) :
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:
| begin NewItems := TStringList.Create; try with TStringList.Create do try LoadFromFile(ExtractFilePath(ParamStr(0)) + 'ClubDateien\Kader.txt'); for I := 2 to Count - 1 do NewItems.Add(Copy(Strings[I], 1, Pos(#32, Strings[I]))); finally Free; end; with Form10 do begin ComboBox1.Items.AddStrings(NewItems); ComboBox2.Items.AddStrings(NewItems); ComboBox3.Items.AddStrings(NewItems); ComboBox4.Items.AddStrings(NewItems); ComboBox5.Items.AddStrings(NewItems); ComboBox6.Items.AddStrings(NewItems); ComboBox7.Items.AddStrings(NewItems); ComboBox8.Items.AddStrings(NewItems); ComboBox9.Items.AddStrings(NewItems); ComboBox10.Items.AddStrings(NewItems); ComboBox11.Items.AddStrings(NewItems); ComboBox23.Items.AddStrings(NewItems); ComboBox24.Items.AddStrings(NewItems); ComboBox25.Items.AddStrings(NewItems); ComboBox26.Items.AddStrings(NewItems); ComboBox27.Items.AddStrings(NewItems); ComboBox28.Items.AddStrings(NewItems); form11.ComboBox23.Items.AddStrings(NewItems); form11.ComboBox1.Items.AddStrings(NewItems); form11.ComboBox2.Items.AddStrings(NewItems); form11.ComboBox3.Items.AddStrings(NewItems); form11.ComboBox4.Items.AddStrings(NewItems); form11.ComboBox5.Items.AddStrings(NewItems); end; finally NewItems.Free; end; end; |
das lädt mir nämlich die namen in die comboboxen...da kann mir mal einer erklären damit ich das verstehe...
unswar:
was genau passiert jetzt zwischen dem try und Free loadfromfile ist ja klar, aber dann die for-schleife... die ist ja das wichtigste...kann mal jemand erklären bitte?
und den Befehl finde ich nicht, der diese NewItems ins Stringgrid einbindet...
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 10.03.05 08:31
Ausnahmsweise, wenn du versprichst, dich mit Stringverarbeitung endlich auseinander zu setzen. Und nochmal der Hinweis: Auf meiner Homepage findest du eine Übersicht der wichtigsten Stringoperationen mit Erläuterungen und ein Programm, das alles nochmal veranschaulicht mit Source.
Delphi-Quelltext 1: 2:
| for I := 2 to Count - 1 do NewItems.Add(Copy(Strings[I], 1, Pos(#32, Strings[I]))); |
Die Schleife fängt bei 2 an, da in deiner Datei noch der Überschriftsbereich drin ist.
In dein NewItem werden nach und nach die Strings mit Add übertragen.
Strings[i] ist ein String aus der StringList in die du mit LoadFromFile eingelesen hast.
Aus diesem String kopierst (copy) du ab Stelle 1 (also vom Anfang) bis zum Leerzeichen (#32) einen Teilstring.
Um die Stelle zu finden, wo das Leerzeichen steht, benötigst du die Funktion Pos.
Ausführlicher Source:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| ... var s : String; TeilString : String; p : Integer; ... for I := 2 to Count - 1 do begin s := Strings[I]; p := Pos(#32, Strings[I]); TeilString := Copy(s, 1, p); NewItems.Add(TeilString); end; |
Hoffe, dass es jetzt verständlich ist.
|
|
arminho 
      
Beiträge: 59
|
Verfasst: Do 10.03.05 10:00
ich danke dir, ich will es ja auch lernen...macht ja keinen sinn wenn ich nur den code kopiere und einfüge!
die schleife hab ich jetzt verstanden...aber das mit der Position des Leerzeichens hab ich nicht ganz verstanden... wieso 32? und wenn ich ihm jetzt sagen will, dass er das zweite Wort bzw. den zweiten STring (in dem Fall wäre es das Alter) kopieren soll, dann muss ich ihm die Stelle angeben, wo der String startet und die position des nächsten Leeerzeichens !? hab ich das richtig verstanden? Nun wie gesagt, verstehe ich das mit der position des Leerzeichens noch nicht, weil die doch verschiedene Positionen haben oder?
danke
|
|
mst-csm
Hält's aus hier
Beiträge: 1
|
Verfasst: Do 10.03.05 10:04
Titel: versuchss mal hiermit
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;
type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; SG1: TStringGrid; procedure FormShow(Sender: TObject); procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm} function StrSplit(const Source: String; const Delimiter: String; Index: Integer): String; var Lcount,Lnumber,LSourceLength,LDelLength,LStart,LEnd: Integer; begin LCount:=1; Lnumber:=0; if Index=0 then LStart:=1 else LStart:=0; LEnd:=0; result:=''; LSourceLength:=length(Source); LDelLength:=length(Delimiter); while(LCount<=LSourceLength)and(LEnd=0)do begin if copy(Source,LCount,LDelLength)=Delimiter then begin inc(LNumber); if LNumber>=Index then begin if LStart=0 then LStart:=LCount+LDelLength else begin LEnd:=LCount; result:=copy(Source,LStart,LEnd-LStart); end; end; Lcount:=Lcount+LDelLength; end else inc(LCount); end; if(LStart>0)and(LEnd=0)then result:=copy(Source,LStart,LSourceLength-LStart+1); end; procedure TForm1.FormShow(Sender: TObject); begin Memo1.Lines.LoadFromFile('Text.txt'); end; procedure TForm1.Button1Click(Sender: TObject); var str,sp: String; p,y,s,z: Integer; begin p:=0; str:=Memo1.Lines.Strings[0]; for y:=0 to 50 do begin sp:=StrSplit(str,' ',y); if(sp<>'')then begin p:=p+1; sp:=''; end; end; SG1.ColCount:=p; SG1.RowCount:=Memo1.Lines.Count; for z:=0 to Memo1.Lines.Count do begin str:=Memo1.Lines.Strings[z]; for s:=0 to p do begin SG1.Cells[s,z]:=StrSplit(str,' ',s); end; end; end; end. |
achte nur darauf, das beide scollbalken des memos aktiviert sind
mfg
mst-csm
Moderiert von Tino: Code- durch Delphi-Tags ersetzt.
|
|
arminho 
      
Beiträge: 59
|
Verfasst: Do 10.03.05 10:05
mag sein das es geht...ich will es aber auch verstehen. trotzdem danke für deine hilfe
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 10.03.05 10:29
arminho hat folgendes geschrieben: | ich danke dir, ich will es ja auch lernen...macht ja keinen sinn wenn ich nur den code kopiere und einfüge!
die schleife hab ich jetzt verstanden...aber das mit der Position des Leerzeichens hab ich nicht ganz verstanden... wieso 32? und wenn ich ihm jetzt sagen will, dass er das zweite Wort bzw. den zweiten STring (in dem Fall wäre es das Alter) kopieren soll, dann muss ich ihm die Stelle angeben, wo der String startet und die position des nächsten Leeerzeichens !? hab ich das richtig verstanden? Nun wie gesagt, verstehe ich das mit der position des Leerzeichens noch nicht, weil die doch verschiedene Positionen haben oder?
danke |
Leerzeichen: ASCII-Code 32. Alles klar?
Wenn du jetzt noch das delete benutzt, kannst du den ersten Teilstring löschen. Danach kannst du den nächsten Teilstring holen. Das ganze geschickt in eine Schleife gebracht und schon funktioniert das.
@mst-csm:

|
|
arminho 
      
Beiträge: 59
|
Verfasst: Do 10.03.05 12:09
aha ok, ich hab jetzt ne ascii-code tabelle gefunden... aber was meinst du genau mit delete? also was sollte den gelöscht werden? der erste string vielleicht?
außerdem noch eine frage: die einzelnen daten haben nicht immer den gleichen abstand zu einander... also da sind nicht etwa immer 12 Leerzeichen bis zum nächsten string sondern dass ist variabel... wie kann ich denn das festlegen?
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 10.03.05 12:31
delete: ja.
[url= www.jasocul.de/Downl...frage.Zip]Hier[/url] noch ein altes Programm von mir mit Source. Dort sind es allerdings Strichpunkte (wie war doch gleich der Plural von Semikolon?) und nicht Leerzeichen die Trennzeichen.
Dein zweites Problem erledigt sich, wenn du das mit delete machst.
|
|
arminho 
      
Beiträge: 59
|
Verfasst: Do 10.03.05 15:50
oh man ey, ich bekomm das nicht hin mit dem delete... verdammt!
ich hab jetzt eigentlich alles verstanden (hoffe ich) mit dem string auslesen und ihn als Teilstring "speichern" etc. aber dieses Delete macht mir zu schaffen...
hab versucht also den TeilString zu löschen... ich glaube mit
Delphi-Quelltext 1:
| delete(Teilstring, 1,p); |
oder so...
aber funktioniert nicht.
das delete muss ja in sie schleife rein, damit er den TeilString immer dann löscht wenn er in die StringGrid eingelesen wurde.
also, krieg das irgendwie nicht hin
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 10.03.05 15:54
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| ... var s : String; TeilString : String; p : Integer; ... for I := 2 to Count - 1 do begin s := Strings[I]; p := Pos(#32, Strings[I]); TeilString := Copy(s, 1, p); NewItems.Add(TeilString); Delete(s, 1, p); s := Trim(s); end; |
|
|
arminho 
      
Beiträge: 59
|
Verfasst: Do 10.03.05 15:59
habs mal so versucht, aber er sagt mir das Integer und String inkompatible typen sind... also muss ich inttostr ? benutzen...!?
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 10.03.05 16:04
Habs gerade getestet. Bei mir kommt der Fehler nicht.
Ich will ja nicht maulen. Aber schonmal was von debuggen gehört?
Die Fehlermeldung ist doch auch ziemlich deutlich. Schau nach was an der Stelle steht, wo er den Fehler meldet.
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 10.03.05 16:05
Habs gerade getestet. Bei mir kommt der Fehler nicht.
Ich will ja nicht maulen. Aber schonmal was von debuggen gehört?
Die Fehlermeldung ist doch auch ziemlich deutlich. Schau nach was an der Stelle steht, wo er den Fehler meldet.
|
|
arminho 
      
Beiträge: 59
|
Verfasst: Do 10.03.05 16:09
also hier zeigt er ihn an:
Delphi-Quelltext
aber was ist jetzt daran falsch? das stimmt doch!?
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 10.03.05 16:13
Schreib mal :
Delphi-Quelltext
|
|
arminho 
      
Beiträge: 59
|
Verfasst: Do 10.03.05 17:12
ok jetzt meckert er aber noch über except oder fianlly erwartet...
da muss ich:
Delphi-Quelltext 1: 2:
| finally newitems.free; |
aber an welcher stelle genau?
|
|
arminho 
      
Beiträge: 59
|
Verfasst: Do 10.03.05 17:32
habs jetzt aber zur laufzeit kommt der fehler:
listenindex überschreitet das maximum (24)...
wenn ich auf den button drücke!
24 zeilen hat die txt-datei...weis aber niocht was er damit meint
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 10.03.05 18:17
Du hast sicher eine Schleife zu deiner Liste.
Listen fangen aber immer bei "0" an zu zählen. Du darfst in der Schleife als nur bis zur Anzahl der Elemente Minus 1 laufen.
Pseudo-Beispiel:
Delphi-Quelltext 1: 2:
| For i := 0 to Liste.Count - 1 do ShowMessage(Liste.Items[i]); |
|
|