![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 к примеру), а затем в цикле найти нужную строку.
|
|
#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. |