TStringlistを使って文字列をTSTringGridに表示

解決


タイガー  2012-11-20 07:09:57  No: 43405

こんにちは。
対戦成績表をTstringListを使ってTStringGridに表示させようとしています。
for m:=0 to BossID.Count-1 do begin//カウント0→35
      sl.add(bossid[m]);
      //Listbox1.Items.add(bossid[m]);//チェック用 ok
      iUma:=StrToInt(Copy(bossID[m],1,2));//馬番ID
      iKako:=StrToInt(Copy(bossID[m],3,1));//過去走ID
      //if(m>0)then
      if(Copy(BossID[m],1,2)=Copy(sl[m],1,2))then begin//馬番が一致
        order:=strtoint(Copy(bossid[m],9,2));//順位
        Tosu:=strtoint(Copy(bossid[m],11,2));//頭数
        Inc(Tosu);
      end;
    end;
このコードだとエラーEConvertErrorがでてしまいます。どこに問題があるのでしょうか。
------------
//Copy(Bossid[m],1,2)+//馬番
                //    IntToStr(ikako)+//+過去走 3,1
                //    Racejyoken+//レース条件+グレード 4,4
                //    Format('%2d',[order])+//9,2
                //    Format('%2d',[tosu]);//頭数11,2
------------
010弥生賞 1 4
021弥生賞 2 4
030弥生賞 3 4
061弥生賞 6 4
011スプS 1 2
020スプS 2 2
------------
01馬番が重なっているので
トータル順位1+1=2
トータル対戦頭数4+2=6
というように馬番ごとのトータル順位とトータル対戦頭数をTstringGridに表示させるたいのです。


KHE00221  2012-11-20 09:25:34  No: 43406

010弥生賞 1 4
123456789ABCD


KHE00221  2012-11-21 08:53:13  No: 43407

4+4=9だから


タイガー  2012-11-22 01:37:33  No: 43408

こんにちは
TStringlistにaddしたデータの重複文字を判定する方法を教えてください。


RAD命  2012-11-22 02:20:37  No: 43409

var
  i : integer;
begin
  i := ListBox1.Items.IndexOf('あいうえお');
  if i = -1 then
    showmessage('重複ありませんでした')
  else
    showmessage(IntToStr(i) + '行目に登録されています');
end;

indexofで、重複行を検索できます。
重複文字を探すなら、
AnsiPosでしょうか?
AnsiPosは、0で見つからず、0以上でその位置を教えてくれます。


RAD命  2012-11-22 02:33:20  No: 43410

//簡単なサンプルですが、
//部分文字列を判定するなら、以下のようになります。
var
  i,i1:integer;
begin
  i1 := 0;
  while listbox1.Items.Count > i1 do begin
    i := ansipos('あいう',listbox1.items[i1]);
    if i = 0 then
     showmessage(IntToStr(i1) + '行目には'
       + char(13) +'見つかりませんでした')
    else begin
      showmessage(IntToStr(i1) + '行目の'
        + chr(13) + IntToStr(i) + '列目にあります');
      //exit;
    end;
    inc(i1);
  end;


タイガー  2012-11-29 06:16:52  No: 43411

こんばんは
ansiposを使った文字判定の方法は確認できました。

質問なんですけど、
istbox1のデータが以下だとして
------------
010弥生賞0104
021弥生賞0204
030弥生賞0304
061弥生賞0604
011スプS0102
020スプS0202
------------
//馬番(2)過去走(1)レース条件(6)順位(2)頭数(2)

最初の馬番(2)のみを文字列から重複していた場合、列ではなく順位(2)を抜き出したい場合はどのようにすればいいのでしょうか。

Tstringlist.indexofを使ってみても部分文字列はヒットしないみたいなので部分的にヒットしたら値を返す方法を教えてください。
---------------------------------
bUma:=Copy(bossid[k],1,2);//馬番
i:=ansipos(inttostr(k0),Copy(bossid[k0],3,1));//前走
index:=bossid.IndexOf(buma);
if(index<>-1)then begin//馬番一致
  if(i<>0)then begin//前走一致
    a0:=strtoint(copy(bossid[k],10,2));//順位
    b0:=strtoint(copy(bossid[k],12,2));//対戦順位
  end;
end;


RAD命  2012-11-29 22:40:06  No: 43412

//以下でどうでしょうか?
//純粋に馬番だけを検索し、ヒットした列の順位だけを、
//listbox2に納めるようにしました。

var
  i,i1:integer;
  s,s1:string;
begin
  i1 := 0;
  while listbox1.Items.Count > i1 do begin
    s1 := listbox1.items[i1];
    i := ansipos(edit1.Text,s1[1]+ s1[2]);
    if i = 0 then begin
     {showmessage(IntToStr(i1) + '行目には'
       + char(13) +'見つかりませんでした')}
    end else begin
      s := listbox1.Items[i1];
      listbox2.Items.Add(s[10] + s[11]);
    end;
    inc(i1);
  end;


RAD命  2012-11-30 20:05:36  No: 43413

//試しにやってみました。
//こんな感じに、Listの文字列を分解して、
//Stringgridに表示させるのでしょうか?
//edit1,listbox1,striggrid1を使ってます。

var
  i,i1,i2:integer;
  s,s1:string;
begin
  i1 := 0;
  i2 := 0;
  while stringgrid1.RowCount > i1 do begin
    stringgrid1.Cols[i1].Clear;
    inc(i1);
  end;
  i1 := 0;
  while listbox1.Items.Count > i1 do begin
    s1 := listbox1.items[i1];
    i := ansipos(edit1.Text,s1[1]+ s1[2]);
    if i = 0 then begin
     {showmessage(IntToStr(i1) + '行目には'
       + char(13) +'見つかりませんでした')}
    end else begin
      inc(i2);
      s := listbox1.Items[i1];

      stringgrid1.Cells[1,i2] := s[1] + s[2];
      stringgrid1.Cells[2,i2] := s[3];
      stringgrid1.Cells[3,i2] :=
      s[4] + s[5] +s[6] + s[7] +s[8] + s[9];
      stringgrid1.Cells[4,i2] := s[10] + s[11];
      stringgrid1.Cells[5,i2] := s[12] + s[13];
    end;
    inc(i1);
  end;


タイガー  2012-12-14 07:51:29  No: 43414

こんばんは、うまくいかないのでもう少し質問させてください。

------------
010弥生賞0104
021弥生賞0204
030弥生賞0304
061弥生賞0604
011スプS0102
020スプS0202
------------
上のようなstringlistがあるとして、
for i:=0 to bossid.count-1 doでループしながら
一つずつ消して文字列比較していく方法はありますか?


HOta  2012-12-14 16:43:02  No: 43415

どのようにして、どんな不具合があるのかを書いてください。


タイガー  2012-12-14 21:36:35  No: 43416

こんにちは。
RAD命さん参考コードありがとうございます。
「Tstringlistを使って文字列をTstringgridに表示する」という投稿については解決しました。
不具合などはなく部分文字列を表示させることはできました。


RAD命  2012-12-15 14:55:55  No: 43417

//一応書いてみました
//こういう事ですか??
procedure TForm1.Button1Click(Sender: TObject);
var
  i,i1,i2,i3:integer;
  s,s1:string;
  setdel: array [0..255] of string;
begin
  i1 := 0;
  i2 := 0;
  for i1:=0 to stringgrid1.RowCount -1 do begin
    //StringGridを初期化する
    stringgrid1.Cols[i1].Clear;
  end;
  i1 := 0;
  for i1 :=0 to listbox1.Items.Count -1 do begin
    //検索対象文字列の取得
    s1 := listbox1.items[i1];
    //検索
    i := ansipos(edit1.Text,s1[1]+ s1[2]);
    if i = 0 then begin
     //もし見つからなければ
     //削除リストに追加
     setdel[i1] := listbox1.Items[i1];
    end else begin
      //もし見つかったならば
      //削除リストには何も入れない
      setdel[i1] := '';
      //StirngGridの列を指定する数値を加算
      inc(i2);
      //見つかったリストの値を取得
      s := listbox1.Items[i1];
      //Grid毎に値を分解して納める
      stringgrid1.Cells[1,i2] := s[1] + s[2];
      stringgrid1.Cells[2,i2] := s[3];
      stringgrid1.Cells[3,i2] :=
      s[4] + s[5] +s[6] + s[7] +s[8] + s[9];
      stringgrid1.Cells[4,i2] := s[10] + s[11];
      stringgrid1.Cells[5,i2] := s[12] + s[13];
    end;
  end;
  //一気に削除
  i3 := 0;
  for i1 := 0 to listbox1.Items.Count -1 do begin
    i3 := listbox1.Items.IndexOf(setdel[i1]);
    if i3 <> -1 then begin
      listbox1.Items.Delete(i3);
    end;
  end;
end;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加