1

Тема: Запис координат у файл і читання в масив

Набридло кожного разу, при запуску програми, задавати координати змінним, особливо, коли їх багато. Потрібно раз задати координати точок у файл(можливо й 20 шт.), які будуть щоразу завантажуватись при запуску програми. Можливо, я й дублюю якусь тему, та з того, що знайшов, не розібрався з масивами. Хотілося б розібратись на простому прикладі, раз і назавжди. Пробую на Delphi 7 чи Lazarus.
Так задаю координати курсора змінним Edit1.Text та Edit2.Text
procedure TForm1.Timer1Timer(Sender: TObject);
begin
GetCursorPos(Pt);
  Label1.Caption:= 'X = ' + IntToStr(Pt.x);
  Label2.Caption:= 'Y = ' + IntToStr(Pt.y);

if getasynckeystate($31)<>0 then //Присвоєння при натисканні "1"
  begin
    Edit1.Text := IntToStr(Pt.x);
    Edit2.Text := IntToStr(Pt.y);
  end;
end;
А далі, запис у файл по рядках і використання при запуску програми.

2 Востаннє редагувалося Torbins (28.04.2014 09:46:10)

Re: Запис координат у файл і читання в масив

Відділяйте мух від котлет. Як саме ви отримуєте змінні і як їх використовуєте - це не стосується вашого питання. У вас є змінні Pt.x і Pt.y, ви їх хочете записати в файл - от і все. А що вони там відображаються на Label-ах чи Edit-ах - то не має значення.
По суті - у вас 4 варіанти:
1. TextFile (чи просто Text). Текстовий файл, в який ви пишете і читаєте рядки так само, як і при звичайному консольному виводі, тільки його ініціалізувати треба:

Прихований текст
var Coord:TextFile;
...
AssignFile( Coord, 'data.txt' );
Reset( Coord );
Readln( Coord, Pt.x, Pt.y);//наприклад
CloseFile (Coord );//не забуваємо закрити.

2. Типізований файл (file of type). Файл неможливо буде редагувати notepad-ом, читати/писати - тільки read-ом і тільки один тип. Перевага: тип може бути будь-який. В іншому - все так само, як і в попередньому варіанті.

Прихований текст
var Coord: file of TPoint;
...
Read( Coord, Pt );

3. Один зі стандартних форматів Delphi. В принципі, тут добре підходить TIniFile, але можна і просто записувати/читати рядки за допомогою будь-якого TStrings.

Прихований текст
var Coord: TIniFile;
...
Coord := TIniFile.Create('data.txt');
Coord.ReadInteger( 'Coordinates', 'X', Pt.x );//розділ Coordinates, ключ X
Coord.Free;//не забуваємо знищити об'єкт.

4. Ваш особистий, унікальний спосіб.

Подякували: doh1

3

Re: Запис координат у файл і читання в масив

Я пробую простіший перший спосіб. Справа в тому, що я буду рідко редагувати дані у файлі, а використовувати щоразу лише одну випадкову пару координат. Це мені потрібно буде зчитувати файла у масив чи можна вибирати якийсь випадковий рядок у файлі? От як часто буває, знаєш чого хочеш, а не знаєш, як реалізувати...

4

Re: Запис координат у файл і читання в масив

Підкажіть, будь ласка, чому рядки, що записуються, дублюються? Невже із-за таймера?

Прихований текст

procedure TForm1.Timer1Timer(Sender: TObject);
var
f:TextFile;
text:String;
begin
GetCursorPos(Pt);
  Label8.Caption:= 'X = ' + IntToStr(Pt.x);
  Label9.Caption:= 'Y = ' + IntToStr(Pt.y);

if getasynckeystate($31)<>0 then
  begin
    Edit2.Text := IntToStr(Pt.x);
    Edit3.Text := IntToStr(Pt.y);

    AssignFile(f, 'point.dat');
    Append(f);  //дописування
    text:=IntToStr(Pt.x)+' '+IntToStr(Pt.y);
    writeln(f, text); //по рядках
    CloseFile(f);
  end;
end;

5

Re: Запис координат у файл і читання в масив

vitalica
Ага, кожного разу, коли спрацьовує таймер і натиснута кнопка "1", ви записуєте нову пару чисел у файл. Якщо тримати кнопку "1" довше ніж інтервал таймера, і при цьому не рухати мишкою, то у файл потраплять однакові пари чисел.
Щоб цього не траплялося, код запису у файл треба повісити на події натискання кнопки OnKeyPress. Якщо захочете використати OnKeyPress, який належить формі, то виставте їй KeyPreview = True.

6

Re: Запис координат у файл і читання в масив

Дуже дякую. Не знав про властивість KeyPreview. Думав вже треба в перехоплювачі вникать. Получилось непогано. Буду мудрувать із виборкою випадкової пари координат, щоб по них клікнути. Періодично буду запитувати, бо знань бракує, але й лінь виконувати монотонну роботу вручну.

7

Re: Запис координат у файл і читання в масив

Звертаюсь знову за допомогою до громади. Ніяк не вдається зчитати файл у масив. У файлі по рядках і дуть пари чисел(координати x та y), розділені пробілом. Мені в один момент потрібна одна(випадкова) пара. Думав, зчитаю в масив, а там виберу, та щось не виходить. Не можу зрозуміти логіку, заплутався геть...

Прихований текст

procedure TForm1.Button6Click(Sender: TObject);
var
f: TextFile;
str: array of string;
fname: String;
begin
name:= '1.txt';
AssignFile(f, fname); //â³äêðèòè ôàéë
Reset(f);
if FileExists(fname) then begin
while (not EOF(f)) do begin
Readln(f, str);
end;
CloseFile(f);
ShowMessage(str[2]);
end;
end;

8 Востаннє редагувалося Torbins (29.04.2014 16:21:54)

Re: Запис координат у файл і читання в масив

Давайте я вам спочатку правильно розставлю відступи:

procedure TForm1.Button6Click(Sender: TObject);
var
  f: TextFile;
  str: array of string;
  fname: String;
begin
  name:= '1.txt';
  AssignFile(f, fname); //â³äêðèòè ôàéë
  Reset(f);
  if FileExists(fname) then 
  begin
    while (not EOF(f)) do 
    begin
      Readln(f, str);
    end;
    CloseFile(f);
    ShowMessage(str[2]);
  end;
end;

Як бачите, якщо файл не знайдеться в поточному каталозі, то повторне натискання на кнопку викличе помилку.

9

Re: Запис координат у файл і читання в масив

Завершуючи тему, хочу подякувати тим, хто не гонорився і, все-таки,
знаходив час на підказки новачку. І хочу запропонувати приклад того, що взнав.
Старався зробити компактним, але й зрозумілим для початківців.
Програма знімає координати курсора натисканням "R", записує у файл, кнопкою "Пуск"
читає із файла координати та робить кліки по цих координатах (є кнопки для увімкнення та вимкнення визначення координат і щоб звільнити клавішу "R").

Прихований текст
//Timer1, Label1, Label2, Edit1, Edit2, Edit2, Button1, Button2, Button3
var
  Form1: TForm1;
  Pt:TPoint; //Глобальна змінна

implementation

{$R *.dfm}

//Щоб форма перехвачувала події
procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.KeyPreview:=True;
end;

    //Для відображення координат курсора
procedure TForm1.Timer1Timer(Sender: TObject);
var
begin
    GetCursorPos(Pt);
    Label1.Caption:= 'X = ' + IntToStr(Pt.x);
    Label2.Caption:= 'Y = ' + IntToStr(Pt.y);
end;
    //Кнопка "Увімкнути координати"
procedure TForm1.Button2Click(Sender: TObject);
begin
  Timer1.Enabled:=True;
end;
    //Кнопка "Вимкнути координати"
procedure TForm1.Button3Click(Sender: TObject);
begin
    Timer1.Enabled:=False;
    Label1.Caption:= '';
    Label2.Caption:= '';
end;
    //Записуємо координати при натисканні клавіші(KeyPreview:=True;)
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
var
    f: TextFile;
    fname,text:String;
begin
        //Якщо натиснута "R"
    if (getasynckeystate($52)<>0) and (Timer1.Enabled=True) then
    begin
        
                //Задаємо ім'я файла для запису координат
        if Edit1.Text='' then 
        begin
            ShowMessage('Задайте ім''я файла');
            Exit;
        end
        else 
        begin
            fname := Edit1.Text+'.dat';
        end;        
        
                //Відображаємо координати, що записуються
        Edit2.Text := IntToStr(Pt.x);
        Edit3.Text := IntToStr(Pt.y);
  
        //Запис у файл
        if Not FileExists(fname) then //якщо файла не існує
        begin
            AssignFile(f, fname);
            Rewrite(f);  //Перезапис файла
            text:=IntToStr(Pt.x)+' '+IntToStr(Pt.y); //Записуємо через пробіл
            writeln(f, text);
        end
        else begin 
            Append(f);  //Дописуємо файла
            text:=IntToStr(Pt.x)+' '+IntToStr(Pt.y);
            writeln(f, text);
        end;
        CloseFile(f); //Закриваємо файла
    end;
end;
    //Кнопка "Пуск"
procedure TForm1.Button1Click(Sender: TObject);
var
    Pt1:TPoint;
    f: TextFile;
    fname,koordx,koordy:String;
    n,p,l:Integer; //Для перебору масива
    mas: array of string; //Для зчитування файла
begin
    n:=0;
    SetLength(mas, 20); //Виділяємо пам'ять для масива
    
    fname := Edit1.Text+'.dat';
    
    if FileExists(fname) then begin //якщо файл існує    
    AssignFile(f, fname); //відкрити файл
    Reset(f); //приготувати для читання

        While not Eof(f) do begin  //поки не кінець файла викон. цикл
            Readln(f, mas[n]);  //читаємо рядок і заносимо у масив
            //Визначаємо координати
            p:= Pos(' ', mas[n]); //позиція пробілу
            l:=Length(mas[n]); //довжина рядка
            koordx:=Copy(mas[n],1,p-1); //текст координати x (рядок до пробілу)
            koordy:=Copy(mas[n],p+1,l); //текст координати y (рядок після пробілу)
            
            //Робимо клік по координатах
            GetCursorPos(Pt); //Визначаємо початкові координати курсора
            Pt1.x := Pt.x; //Запам'ятовуємо
            Pt1.y := Pt.y;
            Pt.x := StrToInt(koordx); //Нові координати курсора
            Pt.y := StrToInt(koordy);
            SetCursorPos(Pt.x,Pt.y); //Переходимо по координатах
            Mouse_Event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//лівий клік миші
            Sleep(1000); //Для візуалізації курсора - "залипання"
            Mouse_Event(MOUSEEVENTF_LEFTUP,0,0,0,0);
            SetCursorPos(Pt1.x,Pt1.y); //Повернення курсора в початкову точку
            Sleep(1000); //Затримка перед наступним кліком
            
            Inc(i);
          end;
    end
    else begin
    ShowMessage('Координати не записані');
    Exit;
    end;
    CloseFile(f); //Закриваємо файл    
    end;
end.
Подякували: Torbins1