На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Чтение и запись в файл - расчёт окружности, помогите создать запись в файл , запись и чтение
    есть программа расчёта пересечения окружностей, помогли сделать чтение из файла, но как сделать запись в файл с начала?

    пробовал сам сделать, но бред получается

    помогите пожалуйста сделать данную программу

    только начал изучать делфи

    ExpandedWrap disabled
      unit Unit1;
      interface
      uses
        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
        Dialogs, StdCtrls, ExtCtrls;
      type
        TForm1 = class(TForm)
          LabeledEdit1: TLabeledEdit;
          LabeledEdit2: TLabeledEdit;
          LabeledEdit3: TLabeledEdit;
          LabeledEdit4: TLabeledEdit;
          LabeledEdit5: TLabeledEdit;
          LabeledEdit6: TLabeledEdit;
          Button1: TButton;
          LabeledEdit7: TLabeledEdit;
          btn2: TButton;
          procedure Button1Click(Sender: TObject);
          procedure btn2Click(Sender: TObject);
        private
          { Private declarations }
        public
          { Public declarations }
        end;
      var
        Form1: TForm1;
      implementation
      {$R *.dfm}
      // думал сделать так, добавить еще одну кнопку и сохранять данные, но абракадабра получается (
      procedure TForm1.btn2Click(Sender: TObject);
      var x1,y1,r1,x2,y2,r2:integer;
          a:textfile;
      begin
      AssignFile(a,'Coord.txt');//файл в папке с программой
      Rewrite(a);
      Writeln (a,x1,y1,r1,x2,y2,r2);
      CloseFile(a);
      LabeledEdit1.Text:=IntToStr(x1);
      LabeledEdit2.Text:=IntToStr(y1);
      LabeledEdit3.Text:=IntToStr(r1);
      LabeledEdit4.Text:=IntToStr(x2);
      LabeledEdit5.Text:=IntToStr(y2);
      LabeledEdit6.Text:=IntToStr(r2);
      Append(a);
      Read(a);
      end;
      // программа чтения из файла к примеру 4 4 4 и в след строке 5 5 5 - работает
      procedure TForm1.Button1Click(Sender: TObject);
      const e=0.0001;
      var x1,y1,r1,x2,y2,r2:integer;
          x,y,a,b,h,d,x3,y3,x4,y4:real;
          f:textfile;
      begin
      AssignFile(f,'Coord.txt');//файл в папке с программой
      Reset(f);
      Read(f,x1,y1,r1,x2,y2,r2);
      CloseFile(f);
      LabeledEdit1.Text:=IntToStr(x1);
      LabeledEdit2.Text:=IntToStr(y1);
      LabeledEdit3.Text:=IntToStr(r1);
      LabeledEdit4.Text:=IntToStr(x2);
      LabeledEdit5.Text:=IntToStr(y2);
      LabeledEdit6.Text:=IntToStr(r2);
      Append(f);
      Writeln(f,'');
      if (abs(x1-x2)<e)and(abs(y1-y2)<e)and(abs(r1-r2)<e)
      then
       begin
         LabeledEdit7.Text:='Окружности совпадают';
         Writeln(f,'Окружности совпадают');
       end
      else
       begin
        d:=sqrt(sqr(x1-x2)+sqr(y1-y2));
        if (d>r1+r2)or(d<abs(r1-r2)) then
         begin
          LabeledEdit7.Text:='Точек пересечения нет';
          Writeln(f,'Точек пересечения нет');
         end
        else if abs(d-(r1+r2))<0.000001 then
         begin
          x:=(x1+x2)/2;
          y:=(y1+y2)/2;
          LabeledEdit7.Text:='Окружности касаются в точке x='
          +FloattostrF(x,ffFixed,6,2)+'  y='
          +FloattostrF(y,ffFixed,6,2);
          Writeln(f,'Окружности касаются в точке x=',x:0:2,'  y=',y:0:2);
         end
        else
         begin
          b:=(sqr(r2)-sqr(r1)+sqr(d))/(2*d);
          a:=d-b;
          h:=sqrt(sqr(r2)-sqr(b));
          x:=x1+(x2-x1)/(d/a);
          y:=y1+(y2-y1)/(d/a);
          x3:=x-(y-y2)*h/b;
          y3:=y+(x-x2)*h/b;
          x4:=x+(y-y2)*h/b;
          y4:=y-(x-x2)*h/b;
          LabeledEdit7.Text:='Точки пересечения x1='
          +FloattostrF(x3,ffFixed,6,2)+'  y1='
          +FloattostrF(y3,ffFixed,6,2)
          +'  x2='+FloattostrF(x4,ffFixed,6,2)+'  y2='
          +FloattostrF(y4,ffFixed,6,2);
          Writeln(f,'Точки пересечения x1=',x3:0:2,' y1=',y3:0:2,' x2=',x4:0:2,'  y2=',y4:0:2);
         end;
        end;
      CloseFile(f);  
      end;
      end.

    Прикреплённый файлПрикреплённый файл______________________________________________1_______________.rar (7,33 Кбайт, скачиваний: 59)
      Наверное результаты расчёта можно вынести в какие-то глобальные переменные:
      ExpandedWrap disabled
        var
          Form1: TForm1;
          x3,y3, x4,y4:real; // результат!
        ...
        procedure TForm1.btn2Click(Sender: TObject);
        var a:textfile;
        begin
          AssignFile( a, 'Coord.txt');//файл в папке с программой
          Rewrite( a );
          Writeln( a, x3,y3, x4,y4);
          CloseFile( a );
          ...
         
        // программа чтения из файла к примеру 4 4 4 и в след строке 5 5 5 - работает
        procedure TForm1.Button1Click( Sender: TObject);
        const e=0.0001;
        var x1,y1,r1,x2,y2,r2 : integer;
            x,y,a,b,h,d : real;
            f:textfile;
        begin
        ...
        Цитата SENDEJ @
        // думал сделать так, добавить еще одну кнопку и сохранять данные, но абракадабра получается (

        Естественно, т.к. локальные переменные x1..r2 изначально содержат какой-то случайный мусор. Поэтому перед использованием их нужно обязательно инициализировать, т.е. присвоить какие-то конкретные значения.
        Если ты хочешь записать в файл значения, которые вводятся в LabeledEdit, то нужно перед записью в файл (лучше перед открытием файла) конвертировать эти значения в числа x1:=StrToInt(LabeledEdit1.Text) и т.д.

        PS: В принципе можно записывать в файл не числовые значения x1 и т.д., а непосредственно их строковые представления из LabeledEdit1 и т.д., но тогда, по хорошему, нужно будет добавить проверки, что во все LabeledEdit введены корректные числа. В случае же преобразования строк в числа через StrToInt, эти проверки выполняются автоматически, и в случае пустого или не числового значения будет выдана ошибка (исключение), и в файл ничего не запишется (если преобразования будут делаться до открытия файла).
        Сообщение отредактировано: leo -
          Цитата leo @
          В случае же преобразования строк в числа через StrToInt, эти проверки выполняются автоматически, и в случае пустого или не числового значения будет выдана ошибка (исключение)

          тогда проще TryStrToInt использовать для проверки. чтобы не ловить исключения.
            Цитата SENDEJ @
            помогите пожалуйста сделать данную программу

            То что вы пытаетесь сделать называется Logger :D
            Советую разбить процесс записи на следующие функции:

            1. Открытие файла
            2. Запись блока данных
            3. Закрытие файла

            ExpandedWrap disabled
              function logOpen(name:string) : textfile;
               var res:textfile;
              begin
               AssignFile(res,name);//файл в папке с программой
               Rewrite(res);
              result:=res;
              end;
               
              procedure logPut(log:TextFile; values:Integer...); // насчёт вариадиков в дельфи не уверен, но, полюбому, должна быть альтернатива
               var i:Integer;
              begin
               for i in values do begin
                WriteLn(a,IntToStr(i));
               end;
              end;
               
              procedure logPut(log:textfile; value:string);
              begin
               WriteLn(a,value);
              end;
               
              procedure logClose(log:textfile);
              begin
               CloseFile(log);
              end;


            В общем случае, ваш код можно переписать как:
            ExpandedWrap disabled
              unit Unit1;
              interface
              uses
                Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
                Dialogs, StdCtrls, ExtCtrls;
              type
                TForm1 = class(TForm)
                  LabeledEdit1: TLabeledEdit;
                  LabeledEdit2: TLabeledEdit;
                  LabeledEdit3: TLabeledEdit;
                  LabeledEdit4: TLabeledEdit;
                  LabeledEdit5: TLabeledEdit;
                  LabeledEdit6: TLabeledEdit;
                  Button1: TButton;
                  LabeledEdit7: TLabeledEdit;
                  btn2: TButton;
                  procedure Button1Click(Sender: TObject);
                  procedure btn2Click(Sender: TObject);
                  procedure FormCreate(Sender: TObject); // <- добавляем метод создания формы
                  procedure FormClose(Sender: TObject; var Action: TCloseAction); // <- добавляем метод закрытия формы
                private
                  { Private declarations }
                public
                  { Public declarations }
                end;
              const
                LOG_FILE:   String = 'Coords.txt'; // файл-лог
                SAVED_FILE: String = 'Saved.txt'; // файл с голыми данными
              var
                Form1: TForm1;
                log:TextFile;
              implementation
              {$R *.dfm}
               
              function logOpen(name:String) : TextFile;
               var res:TextFile;
              begin
               AssignFile(res,name);//файл в папке с программой
               Rewrite(res);
              result:=res;
              end;
               
              procedure logPut(log:TextFile; values:Integer...); // насчёт вариадиков в дельфи не уверен, но, полюбому, должна быть альтернатива
               var i:Integer;
              begin
               for i in values do begin
                WriteLn(a,IntToStr(i));
               end;
              end;
               
              procedure logPut(log:TextFile; value:String);
              begin
               WriteLn(a,value);
              end;
               
              procedure logClose(log:TextFile);
              begin
               CloseFile(log);
              end;
               
              procedure TForm1.FormCreate(Sender: TObject); // при создании формы открываем лог, тем самым, закрываем к нему доступ для других программ
              begin
               log:=logOpen(LOG_FILE); // запоминаем открытый лог в глобальную переменную
              end;
               
              procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
              begin
               logClose(log); // закрываем файл и освобождаем открытый лог
              end;
               
              procedure TForm1.btn2Click(Sender: TObject);
               var x1,y1,r1,x2,y2,r2:Integer;
               f:TextFile;
              begin
               
               x1:=StrToInt(LabeledEdit1.Text);
               y1:=StrToInt(LabeledEdit2.Text);
               r1:=StrToInt(LabeledEdit3.Text);
               x2:=StrToInt(LabeledEdit4.Text);
               y2:=StrToInt(LabeledEdit5.Text);
               r2:=StrToInt(LabeledEdit6.Text);
               
               logPut(x1,y1,r1,x2,y2,r2); // записываем данные в лог
               
               AssignFile(f,SAVED_FILE); // сохраняем данные в файл с сохранениями
               ReWrite(f);
               Write(f,x1,y1,r1,x2,y2,r2);
               CloseFile(f);
               
              end
               
              // программа чтения из файла к примеру 4 4 4 и в след строке 5 5 5 - работает
              procedure TForm1.Button1Click(Sender: TObject);
               const e=0.0001;
               var x1,y1,r1,x2,y2,r2:Integer;
               x,y,a,b,h,d,x3,y3,x4,y4:real;
               f:TextFile;
              begin
               
               AssignFile(f,SAVED_FILE);
               Reset(f);
               Read(f,x1,y1,r1,x2,y2,r2);
               CloseFile(f);
               
               LabeledEdit1.Text:=IntToStr(x1);
               LabeledEdit2.Text:=IntToStr(y1);
               LabeledEdit3.Text:=IntToStr(r1);
               LabeledEdit4.Text:=IntToStr(x2);
               LabeledEdit5.Text:=IntToStr(y2);
               LabeledEdit6.Text:=IntToStr(r2);
               
               if (abs(x1-x2)<e)and(abs(y1-y2)<e)and(abs(r1-r2)<e)
               then
                begin
                  LabeledEdit7.Text:='Окружности совпадают';
                  logPut('Окружности совпадают');
                end
               else
                begin
                 d:=sqrt(sqr(x1-x2)+sqr(y1-y2));
                 if (d>r1+r2)or(d<abs(r1-r2)) then
                  begin
                   LabeledEdit7.Text:='Точек пересечения нет';
                   logPut('Точек пересечения нет');
                  end
                 else if abs(d-(r1+r2))<0.000001 then
                  begin
                   x:=(x1+x2)/2;
                   y:=(y1+y2)/2;
                   LabeledEdit7.Text:='Окружности касаются в точке x='
                   +FloattostrF(x,ffFixed,6,2)+'  y='
                   +FloattostrF(y,ffFixed,6,2);
                   logPut(LabeledEdit7.Text);
                  end
                 else
                  begin
                   b:=(sqr(r2)-sqr(r1)+sqr(d))/(2*d);
                   a:=d-b;
                   h:=sqrt(sqr(r2)-sqr(b));
                   x:=x1+(x2-x1)/(d/a);
                   y:=y1+(y2-y1)/(d/a);
                   x3:=x-(y-y2)*h/b;
                   y3:=y+(x-x2)*h/b;
                   x4:=x+(y-y2)*h/b;
                   y4:=y-(x-x2)*h/b;
                   LabeledEdit7.Text:='Точки пересечения x1='
                   +FloattostrF(x3,ffFixed,6,2)+'  y1='
                   +FloattostrF(y3,ffFixed,6,2)
                   +'  x2='+FloattostrF(x4,ffFixed,6,2)+'  y2='
                   +FloattostrF(y4,ffFixed,6,2);
                   logPut(LabeledEdit7.Text);
                  end;
                 end;
               end;
              end.
            Сообщение отредактировано: VisualProg -
              Цитата VisualProg @


              Большое спасибо, Вы правы, подскажите пожалуйста по поводу формы, насколько я понял, добавляются еще 2 компонента на форму

              Delphi 7 - ругается на "function logOpen(name:String) : TextFile;"
              Сообщение отредактировано: SENDEJ -
                Цитата SENDEJ @
                насколько я понял, добавляются еще 2 компонента на форму

                Нет. Это не компоненты. Это методы. Компонент всё тот же - TForm экземпляр которого вы используете под именем Form1.

                Переделал под Delphi7. Надеюсь, я правильно понял то что вы хотели...
                Прикреплённый файлПрикреплённый файл______________________________________________2_.rar (172,46 Кбайт, скачиваний: 59)
                  Цитата VisualProg @

                  да, именно это, большое спасибо
                  1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0358 ]   [ 19 queries used ]   [ Generated: 17.05.24, 12:14 GMT ]