Q&A

  • 데이터파일을 읽어 StringGrid로 보내고 다시 StringGrid의 각 값을 랜덤하게
데이터파일을 읽어 StringGrid로 읽어들인뒤 다시 StringGrid의 각 셀의 데이터 값을

랜덤하게 돌리는 방법..

프로그램이 실행되면 StringGrid의 값이 데이터파일의 값들이 그리드의 임의의 위치로

마구 변하게 하고 싶은데...



제생각으로 데이터 파일을 읽어들일 때 배열에 넣고 배열의 위치를 랜덤하게 사용하면

어떨까 합니다.



도움을 부탁드립니다.



데이터 파일의 내용은..

256 187 545 354 632

254 456 123 152 324

354 124 325 221 100

125 213 110 200 201

152 334 389 754 323

165 453 146 249 274

238 654 195 183 148

135 171 191 225 246

319 284 299 176 146

265 887 194 331 265

543 147 246 247 295

162 443 241 146 555

244 233 153 174 199

228 167 310 257 234

310 193 175 164 102

165 167 356 275 162

2  COMMENTS
  • Profile
    이재식 2000.02.15 22:05
    이상학 wrote:

    > 데이터파일을 읽어 StringGrid로 읽어들인뒤 다시 StringGrid의 각 셀의 데이터 값을

    > 랜덤하게 돌리는 방법..

    > 프로그램이 실행되면 StringGrid의 값이 데이터파일의 값들이 그리드의 임의의 위치로

    > 마구 변하게 하고 싶은데...

    >

    > 제생각으로 데이터 파일을 읽어들일 때 배열에 넣고 배열의 위치를 랜덤하게 사용하면

    > 어떨까 합니다.

    >

    > 도움을 부탁드립니다.

    >

    > 데이터 파일의 내용은..

    > 256 187 545 354 632

    > 254 456 123 152 324

    > 354 124 325 221 100

    > 125 213 110 200 201

    > 152 334 389 754 323

    > 165 453 146 249 274

    > 238 654 195 183 148

    > 135 171 191 225 246

    > 319 284 299 176 146

    > 265 887 194 331 265

    > 543 147 246 247 295

    > 162 443 241 146 555

    > 244 233 153 174 199

    > 228 167 310 257 234

    > 310 193 175 164 102

    > 165 167 356 275 162



    이재식 Wrote :

    안녕하세요?



    맞습니다.

    스트링 그리드에 넣은다음 랜덤하게 그 위치를 바꾸려면 기존의 데이터를

    덮어쓸 염려가 있고 쓸데없는 if문이 추가됩니다.

    따라서, 데이터값들을 스트링그리드에 넣기전에, 스트링그리드의 행과 열을

    나타내는 사용자 변수를 만들어서 하면 될 것입니다.

    randomize, random()를 사용하셔서 각각의 데이터마다 임의의 행과 열을 얻어냅니다.

    그런다음 스트링그리드에 넣어주는데, 이때 기존에 이미 들어가 있으면

    다시 난수를 구해서 새로운 좌표값일때만 넣으면 되겠죠.

    코딩은 어렵지 않으니까 금방 하실수 있을 겁니다.



  • Profile
    이상학 2000.02.16 20:27
    이재식 wrote:

    > 이상학 wrote:

    > > 데이터파일을 읽어 StringGrid로 읽어들인뒤 다시 StringGrid의 각 셀의 데이터 값을

    > > 랜덤하게 돌리는 방법..

    > > 프로그램이 실행되면 StringGrid의 값이 데이터파일의 값들이 그리드의 임의의 위치로

    > > 마구 변하게 하고 싶은데...

    > >

    > > 제생각으로 데이터 파일을 읽어들일 때 배열에 넣고 배열의 위치를 랜덤하게 사용하면

    > > 어떨까 합니다.

    > >

    > > 도움을 부탁드립니다.

    > >

    > > 데이터 파일의 내용은..

    > > 256 187 545 354 632

    > > 254 456 123 152 324

    > > 354 124 325 221 100

    > > 125 213 110 200 201

    > > 152 334 389 754 323

    > > 165 453 146 249 274

    > > 238 654 195 183 148

    > > 135 171 191 225 246

    > > 319 284 299 176 146

    > > 265 887 194 331 265

    > > 543 147 246 247 295

    > > 162 443 241 146 555

    > > 244 233 153 174 199

    > > 228 167 310 257 234

    > > 310 193 175 164 102

    > > 165 167 356 275 162

    >

    > 이재식 Wrote :

    > 안녕하세요?

    >

    > 맞습니다.

    > 스트링 그리드에 넣은다음 랜덤하게 그 위치를 바꾸려면 기존의 데이터를

    > 덮어쓸 염려가 있고 쓸데없는 if문이 추가됩니다.

    > 따라서, 데이터값들을 스트링그리드에 넣기전에, 스트링그리드의 행과 열을

    > 나타내는 사용자 변수를 만들어서 하면 될 것입니다.

    > randomize, random()를 사용하셔서 각각의 데이터마다 임의의 행과 열을 얻어냅니다.

    > 그런다음 스트링그리드에 넣어주는데, 이때 기존에 이미 들어가 있으면

    > 다시 난수를 구해서 새로운 좌표값일때만 넣으면 되겠죠.

    > 코딩은 어렵지 않으니까 금방 하실수 있을 겁니다.

    >



    소스를 수정했는데..엑세스 바이얼레이션 에러가 뜨네요..

    파일의 한 라인씩읽어들이고 위의 데이터 파일에 구분자 '|'를 넣구..각각의 문자열(256)을 읽어

    들여 동적 배열에 넣었거든요...문자열 처리를 위해 pascount와 passtring 함수를 사용 했는데..

    문제가 좀 있습니다.

    괜찮으시다면... 수정을 부탁해도 될런지요..





    unit mo_user;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    Grids, ExtCtrls, OleCtrls, graphsv3, ChartEngine, HSeries, HSProcs,

    HChart,IniFiles;



    type

    TForm2 = class(TForm)

    Panel1: TPanel;

    Panel2: TPanel;

    StringGrid1: TStringGrid;

    HSChart1: THSChart;

    Series1: TBarSeries;

    Series2: TBarSeries;

    Series3: TBarSeries;

    Series4: TBarSeries;

    Series5: TBarSeries;

    Series6: TBarSeries;

    Timer1: TTimer;

    procedure FormCreate(Sender: TObject);

    procedure FormClose(Sender: TObject; var Action: TCloseAction);

    procedure readdata;

    procedure chartview;

    function PasCount(const s, delimiters : string) : integer;

    function PasString(const s, delimiters : string;num:integer):string;

    private

    { Private declarations }

    public

    { Public declarations }

    IniF : TIniFile; // INI 객체형 변수

    f: textfile; //핸들러

    sStr : array of string;

    line : integer;

    end;



    var

    Form2: TForm2;



    implementation

    {$R *.DFM}



    //폼 생성

    procedure TForm2.FormCreate(Sender: TObject);

    var

    i,j : integer;

    begin

    StringGrid1.Cells[0,0] := ' 장비주소 ';

    //ini 파일 Read

    IniF := TIniFile.Create('D:monitormoni_ini.ini');



    with IniF do

    begin

    try

    for i := 1 to ReadInteger('Count','connect_info_No',0) do

    begin

    //ini 파일중 연결매체 항목

    StringGrid1.Cells[i,0] := IniF.ReadString('connect_info',IntToStr(i),'');

    StringGrid1.ColCount := StringGrid1.ColCount + 1;

    end;

    StringGrid1.ColCount := StringGrid1.ColCount - 1;

    //ini 파일중 장비주소 명

    for j := 1 to ReadInteger('Count','jangbi_addr_No',0) do

    begin

    StringGrid1.Cells[0,j] := IniF.ReadString('jangbi_addr',IntToStr(j),'');

    StringGrid1.RowCount := StringGrid1.RowCount + 1;

    end;

    StringGrid1.RowCount := StringGrid1.RowCount -1;



    finally

    IniF.Free;

    end;

    end; // 장비명? 연결매채명???? 아무리 늘려봐!!!! 맘대로 늘어나!



    readdata;





    end;



    //폼 죽이기

    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);

    begin

    action := caFree;

    end;

    //파일의 데이터 읽어옴

    procedure TForm2.readdata;

    var

    i,j,line : integer;

    str : string[8];



    begin

    assignfile(f,'monitor.dat'); //데이터 파일 read

    reset(f);



    while not Eof(f) do

    begin

    //ini 파일 읽을때 rowcount가 16개 잡혀 버려 하는 수 없이 -16을 했는데...

    line := StringGrid1.RowCount - 1 ;//첫번째행(필드이름)을 제외하고 그리드에 뿌리기 때문에.. 임의 공간이 하나 생기므로 고놈을 지운다~



    //각각의 필드별 데이터 읽어온다.

    Readln(f, str);

    PasCount(str,'|');

    { for i := 1 to PasCount(str,'|') do

    begin

    sStr[i]:=PasString(str,'|',PasCount(str,'|'));

    StringGrid1.Cells[i, line] := sStr[i];

    end;

    }

    StringGrid1.RowCount := StringGrid1.RowCount + 1 ; //row 1씩 증가



    // chartview;

    ReadLn(f) ; //다음 row 를 읽어들인다.

    end ;

    StringGrid1.RowCount := StringGrid1.RowCount -16 ; // 만든 것보담 하나 더 만들어 지므로~~



    Closefile(f);

    end;

    function Tform2.PasCount(const s, delimiters : string) : integer;

    var

    delimiter : Boolean;

    count,i :integer;

    begin

    count := 0;

    delimiter := true;

    if Length(s) >0 then

    begin

    i := 1;

    while (Pos(s[i], delimiters)<> 0) and (i <= Length(s)) do

    inc(i);

    for i := i to length(s) do

    if Pos(s[i], delimiters)<>0 then

    delimiter := true

    else

    begin

    if delimiter = true then inc(count);

    delimiter := false;

    end;

    end;

    PasCount := count;

    end;



    function TForm2.PasString(const s, delimiters : string;num:integer):string;

    var

    i,j,sLength,sStart,sEnd:integer;

    begin

    if pasCount(s,delimiters)>num then

    begin

    sStart := 1;

    while (Pos(s[sStart],delimiters)<> 0 ) and (sStart <= Length(s)) do inc(sStart);

    for j := 1 to num -1 do

    begin

    while Pos(s[sStart],delimiters)=0 do inc(sStart);

    while Pos(s[sStart],delimiters)<>0 do inc(sStart);

    end;

    sEnd := sStart;

    for i := sStart to Length(s) do

    begin

    if s[i] = delimiters then break;

    if s[i] <> delimiters then inc(sEnd);

    end;

    sLength := sEnd - sStart;

    PasString := trim(copy(s,sStart,sLength));

    end

    else

    PasString := '';

    end;



    procedure Tform2.chartview; //스티링 그리드의 값을 차트로 그림~

    begin

    // HSChart1.:=(StringGrid1.Cells[0, line]) ; //TChart에 한 종목당 StringGrid의 각 필드별 데이터입력

    {

    Series1.AddY(Strtoint(StringGrid1.Cells[1, line]));

    Series2.AddY(strtoint(StringGrid1.Cells[2, line]));

    Series3.AddY(strtoint(StringGrid1.Cells[3, line]));

    Series4.AddY(strtoint(StringGrid1.Cells[4, line]));

    Series5.AddY(strtoint(StringGrid1.Cells[5, line]));

    Series6.AddY(strtoint(StringGrid1.Cells[6, line]));



    }

    end;



    end.