Autor Beitrag
arminho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59



BeitragVerfasst: 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:
ausblenden 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 user profile iconTino: Code-Tags hinzugefügt.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59



BeitragVerfasst: Mi 09.03.05 21:53 
welche letzte aufgabe meinst du denn?
mit dem hier vielleicht (natürlich erst umgeformt) :

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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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.
ausblenden 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:
ausblenden 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]; // Der String aus der StringList, aus deiner Datei
  p := Pos(#32, Strings[I]); // Die Stelle des ersten Leerzeichens in diesem String
//  p := Pos(' ', Strings[I]); Hätte auch funktioniert
  TeilString := Copy(s, 1, p); // So steht die copy-funktion in deinem Source
  NewItems.Add(TeilString);  
end;

Hoffe, dass es jetzt verständlich ist.
arminho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59



BeitragVerfasst: 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



BeitragVerfasst: Do 10.03.05 10:04 
Titel: versuchss mal hiermit
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:
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
//Funktion um String zu Splitten
//------------------------------------------------------------------------------
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
        //Spalten
        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;
        //Zeilen für StringGrid1
        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 user profile iconTino: Code- durch Delphi-Tags ersetzt.
arminho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59



BeitragVerfasst: Do 10.03.05 10:05 
mag sein das es geht...ich will es aber auch verstehen. trotzdem danke für deine hilfe
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 10.03.05 10:29 
user profile iconarminho 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:
:welcome:
arminho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59



BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 10.03.05 15:54 
ausblenden 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]; // Der String aus der StringList, aus deiner Datei
  p := Pos(#32, Strings[I]); // Die Stelle des ersten Leerzeichens in diesem String
//  p := Pos(' ', Strings[I]); Hätte auch funktioniert
  TeilString := Copy(s, 1, p); // So steht die copy-funktion in deinem Source
  NewItems.Add(TeilString);
// so sollte es funktionieren:  
  Delete(s, 1, p); // löscht aus s den Teilstring
  s := Trim(s); // nur falls mehrere Leerzeichen drinstehen (nach dem Namen z.B.)

// ab hier mit dem neuen String s weiter machen.
end;
arminho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59



BeitragVerfasst: Do 10.03.05 16:09 
also hier zeigt er ihn an:

ausblenden Delphi-Quelltext
1:
Delete(s, 1, p);					


aber was ist jetzt daran falsch? das stimmt doch!?
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 10.03.05 16:13 
Schreib mal :
ausblenden Delphi-Quelltext
1:
system.delete(s,1,p);					
arminho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59



BeitragVerfasst: Do 10.03.05 17:12 
ok jetzt meckert er aber noch über except oder fianlly erwartet...

da muss ich:

ausblenden Delphi-Quelltext
1:
2:
finally
newitems.free;

aber an welcher stelle genau?
arminho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
For i := 0 to Liste.Count - 1 do
  ShowMessage(Liste.Items[i]);