![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте, Всех с наступившим 2012 годом.
Вот у меня есть текстовый файл: 20:30:40:50:48:52:124:23:47:14:52:99:107:25:87:86: 14:11:47:44 25:34:41:57:47:58:224:73:77:54:50:49:117:27:87:88: 44:16:77:94 и таких 20 строк. Ниже приведен код, где имеется поле 20х20 ячеек. Как сделать, чтобы каждая строка в txt файле соответствовала строке поля, а каждая цифра, разделённая : , соответствовала номеру ячейки? При клике в соответствующем поле (ячейке) должна выводится соответствующая цифра. Недоделанный Код: Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, jpeg; type TForm1 = class(TForm) Image1: TImage; Image2: TImage; procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } public { Public declarations } end; var Form1: TForm1; M: Array [1..20] of Array [1..20] of Integer; implementation {$R *.dfm} Procedure UstSob; Var i,j: Integer; begin For i:= 1 To 20 Do For j:= 1 To 20 Do M[i,j]:= 0; // Обнулим все ячейки M[1,1]:= $10; // установим на яч. 1х1 событие ($00-$FF) M[20,20]:= $20; // установим на яч. 20х20 событие ($00-$FF) end; procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var F: TextFile; S: string; Const a = 20; b = 20; begin UstSob; Image2.Left:= a*(X div a); Image2.Top:= b*(Y div b); if M[(X div a)+1,(Y div b)+1] = $10 Then ShowMessage('Событие $10'); if M[(X div a)+1,(Y div b)+1] = $20 Then ShowMessage('Событие $20'); begin AssignFile(F, '1.txt'); Reset(F); Readln(F, S); ShowMessage(S); CloseFile(F); end; end; end. Помогите пожалуйста доделать, никак сообразить не могу. На всякий случай пример: Последний раз редактировалось Ankor, 01.01.2012 в 18:12. |
#2
|
||||
|
||||
![]() Где-то на форуме подобное уже давал(чтение координат или тп). Должны быть и примеры получше, но не у меня
![]() |
Этот пользователь сказал Спасибо YVitaliy за это полезное сообщение: | ||
Ankor (01.01.2012)
|
#3
|
|||
|
|||
![]() Спасибо YVitaliy, Ваш пример понравился, незнаю есть лучше или нет...
А вот как в этом примере сделать, чтобы считывать код например с метки: #Pole2 ? Тоесть в txt файле будет к примеру несколько записей: #Pole1 20:30:40:50:48:52:124:23:47:14:52:99:107:25:87:86: 14:11:47:44 25:34:41:57:47:58:224:73:77:54:50:49:117:27:87:88: 44:16:77:94 и таких 20 строк. #Pole2 20:30:40:50:48:52:124:23:47:14:52:99:107:25:87:86: 14:11:47:44 25:34:41:57:47:58:224:73:77:54:50:49:117:27:87:88: 44:16:77:94 и таких 20 строк. (цифры другие естественно) Вот код из примера: Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, jpeg; type TForm1 = class(TForm) Image1: TImage; Image2: TImage; procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; M: Array [1..20] of Array [1..20] of Integer; implementation {$R *.dfm} function numnum(var sss:string):string;//получаем число до первого ":" и удаляем его вместе с ":" из строки var n:integer; begin result:=sss; if length(sss)<=1 then exit; n:=pos(':',sss);//позиция ":" if n=0 then exit;//значит последнее число result:=copy(sss,1,n-1);//копируем число delete(sss,1,n);//удаляем end; Procedure UstSob; Var i,j: Integer; begin For i:= 1 To 20 Do For j:= 1 To 20 Do M[i,j]:= 0; // Обнулим все ячейки // M[1,1]:= $10; // установим на яч. 20х20 событие ($00-$FF) // M[20,20]:= $20; // установим на яч. 20х20 событие ($00-$FF) end; procedure ReadFile(const FileName:string); var F: TextFile; S: string; i,j:integer; Begin AssignFile(F, FileName); Reset(F); j:=1;//По X while (not eof(f)) do begin Readln(F, S);//читаем строку for i:=1 to 20 do begin //По Y M[i][j]:=strtoint(numnum(s));//читаем 20 чисел из строки. Числа из строки удаляются end; inc(j); end; CloseFile(F); end; procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Const a = 20; b = 20; begin Image2.Left:= a*(X div a); Image2.Top:= b*(Y div b); caption:=(format('Событие %s%d',['$',M[(X div a)+1,(Y div b)+1]]));//так быстрее проверять) end; procedure TForm1.FormCreate(Sender: TObject); begin ReadFile('1.txt'); //Читаем файл и заполняем массив end; end. Подскажите пожалуйста, буду очень признателен. |
#4
|
||||
|
||||
![]() Конечно можно использовать ReadLn и после каждой прочитанной строки сравнивать с искомым словом, но удобнее разом считать в поток (StringList к примеру), а затем в цикле найти нужную строку.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#5
|
||||
|
||||
![]() Тут при чтении строки нужно ее проверять, читать номер нужного поля и далее тоже самое. Только массив трехмерный будет.
Код:
var F: TextFile; S,S1: string; i,j,n:integer; Begin AssignFile(F, FileName); Reset(F); n:=0; while (not eof(f)) do begin Readln(F, S); if copy(S,1,5)='#Pole' then begin S1:=copy(S,6,maxint); n:=strtointdef(S1,1); j:=1;//По X while (not eof(f)) do begin Readln(F, S);//читаем строку for i:=1 to 20 do begin //По Y M[n][i][j]:=strtoint(numnum(s));//читаем 20 чисел из строки. Числа из строки удаляются end; inc(j); end; end; end; Код:
S1:=copy(S,6,maxint); n:=strtointdef(S1,1); Все, у меня лимит инета исчерпался, так что минимум ближайшую неделю буду в оффлайне ![]() Good bye! Последний раз редактировалось YVitaliy, 02.01.2012 в 01:22. |
Этот пользователь сказал Спасибо YVitaliy за это полезное сообщение: | ||
Ankor (02.01.2012)
|
#6
|
|||
|
|||
![]() Сделал так, но не работает, и как тогда эту строчку прописать:
Код:
Label1.caption:=(format('Событие %s%d',['',M[(X div a)+1,(Y div b)+1]])); Код: Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, jpeg, StdCtrls; type TForm1 = class(TForm) Image1: TImage; Image2: TImage; Label1: TLabel; procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; M: Array [1..20] of Array [1..20] of Array [1..20]of Integer; implementation {$R *.dfm} function numnum(var sss:string):string;//получаем число до первого ":" и удаляем его вместе с ":" из строки var n:integer; begin result:=sss; if length(sss)<=1 then exit; n:=pos(':',sss);//позиция ":" if n=0 then exit;//значит последнее число result:=copy(sss,1,n-1);//копируем число delete(sss,1,n);//удаляем end; Procedure UstSob; Var i,j,n: Integer; begin For n:= 1 To 20 Do For i:= 1 To 20 Do For j:= 1 To 20 Do M[n,i,j]:= 0; // Обнулим все ячейки end; procedure ReadFile(const FileName:string); var F: TextFile; S,S1: string; i,j,n:integer; Begin AssignFile(F, FileName); Reset(F); n:=0; while (not eof(f)) do begin Readln(F, S); if copy(S,1,5)='#Pole1' then begin S1:=copy(S,6,maxint); n:=strtointdef(S1,1); j:=1;//По X while (not eof(f)) do begin Readln(F, S);//читаем строку for i:=1 to 20 do begin //По Y M[n][i][j]:=strtoint(numnum(s));//читаем 20 чисел из строки. Числа из строки удаляются end; inc(j); end; end; end; CloseFile(F); end; procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Const a = 20; b = 20; begin Image2.Left:= a*(X div a); Image2.Top:= b*(Y div b); Label1.caption:=(format('Событие %s%d',['',M[(X div a)+1,(Y div b)+1]]));//так быстрее проверять) end; procedure TForm1.FormCreate(Sender: TObject); begin ReadFile('2.txt'); //Читаем файл и заполняем массив end; end. Подскажите пожалуйста, как правильно сделать? Последний раз редактировалось Ankor, 02.01.2012 в 06:54. |
#7
|
||||
|
||||
![]() А вот так не хотите попробовать?
Код:
Var Data,Row: TStringList; R,C,i: Integer; BeginRead: Boolean; begin StringGrid1.RowCount := 1; StringGrid1.ColCount := 1; StringGrid1.FixedCols := 0; StringGrid1.FixedRows := 0; Data := TStringList.Create; R := 0; BeginRead := False; Data.LoadFromFile('C:\1\data.txt'); for i := 0 to Data.Count - 1 do if Pos('#Pole2',Data.Strings[i]) <> 0 then begin BeginRead := True; Continue; end else if BeginRead then begin Row := TStringList.Create; Row.Text := StringReplace(Data.Strings[i],':',#13#10,[rfReplaceAll]); if StringGrid1.ColCount < Row.Count then StringGrid1.ColCount := Row.Count; StringGrid1.RowCount := R + 1; StringGrid1.Rows[R] := Row; Inc(R); Row.Free; end; Data.Free; end; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#8
|
|||
|
|||
![]() Спасибо конечно, но в чем у меня ошибка Выше 2 постами, как там сделать?
Там код то работал, с двумерным массивом правда, надо всего-то сделать так, чтобы по заданному кодовому слову определялся участок текста в файле, и дальше с ним работал. Последний раз редактировалось Ankor, 02.01.2012 в 15:32. |
#9
|
|||
|
|||
![]() Спасибо всем.
Последний раз редактировалось Ankor, 07.01.2012 в 04:10. |