Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.25;
Скачать: CL | DM;

Вниз

Как создать фай *.txt и записать в него данные.   Найти похожие ветки 

 
vegarulez ©   (2006-06-04 22:00) [0]

Доброго времени суток мастера! У меня такой вопрос. Как создать и записать данные в текстовый файл. То бишь есть к пример Tedit в котором есть данные, или допустим Tmemo...
Так вот надо к примеру создать файл и записать в него данные...
Я делаю скорее всего неправильно, и меня выскаивает ошибка в строке помеченной $$$ (Project Project2.exe raised exception class ElnOutError with message "I/O error 103" Process stopped Use Step or Run to continue)...
Но что-то нигде не могу найти примеров создания файлов  и работы с ними... поможите ссылью... или малеким примерчиком с записью hello world в файлик 1.txt

Вот как я делаю... замудрёно и не понятно... по книженции...

unit Unit1;

interface

uses
 SysUtils, Types, Classes, Variants, QTypes, QGraphics, QControls, QForms,
 QDialogs, QStdCtrls;

 const
 filename:string[5]="1.dat";
type

 TForm1 = class(TForm)
   Button1: TButton;
   Edit1: TEdit;
   Edit2: TEdit;
   Label1: TLabel;
   Label2: TLabel;
   procedure Button1Click(Sender: TObject);
   procedure ClearEdits;
 private
   { Private declarations }
 public
   { Public declarations }
   end;

   Trecord=record
   Vata:string[20];
   end;
var
 Form1: TForm1;

implementation

{$R *.xfm}

type
Txt = file of Trecord;
var
RecFile: Txt;

procedure Tform1.ClearEdits;
var
i:integer;
begin
for i:=0 to controlcount-1 do
if controls[i] is tedit then
(controls[i] as Tedit).text:="";
end;

procedure TForm1.Button1Click(Sender: TObject);
var rec: Trecord;
tmp:Integer;
begin
rec.Vata:=Edit2.text;
$$$ tmp:=FilePos(recFile);  $$$
seek(RecFile, FileSize(recFile));
write(RecFile,Rec);
seek(RecFile,tmp);
ClearEdits;

end;
end.


 
Kolan ©   (2006-06-04 22:02) [1]


> или допустим Tmemo...

Тут все оч. просто
Memo.Lines.SaveToFile("MyFile.txt");
И всё


 
vegarulez ©   (2006-06-04 22:08) [2]

Спасибо. Работает.
Тогда возникает другой вопрос. Как сделать чтобы он добавлял новые записи не переписывая старые....


 
Джо ©   (2006-06-04 22:14) [3]

> [2] vegarulez ©   (04.06.06 22:08)
> Спасибо. Работает.
> Тогда возникает другой вопрос. Как сделать чтобы он добавлял
> новые записи не переписывая старые....

Самое простое:
var
 TempStrings: TStrings;
begin
 TempStrings := TStringList.Create;
 try
   TempStrings.LoadFromFile("имя файла");
   TempStrings.AddStrings(Memo1.Lines);
   TempStrings.SaveToFile("имя файла");
 finally
   TempStrings.Free
 end;
end;


 
vegarulez ©   (2006-06-04 22:15) [4]

Ахха...
вроде понятно всё. Спасибо большое...

порой в книге така ватка написана... автору отровать бы что-нить...


 
Kolan ©   (2006-06-04 22:17) [5]

Вообще в Delphi множество способов работать с файлами:
1. Через WimAPI с этим в MSDN.
2. Старый паскалевский спозоб.
 Понадобится:
 AssignFile,
 Reset,
 Append,
 Rewrite,
 CloseFile.

3. Можно использовать TFileStream.
Все в спарвке есть.
--

> Тогда возникает другой вопрос. Как сделать чтобы он добавлял
> новые записи не переписывая старые....


Как простейший вариант:
Дело втом что
Memo.Lines.SaveToFile("MyFile.txt");
от мемо не зависит. У мемо есть св-во Lines: TStrings.
Вот эти TStrings и делают работу по сохранению.

Поэтому можно так:
var
 Strings: TStrings;
begin
 Strings := TStringList.Create;
 try
   // Грузим старое.
   Strings.LoadFromFile("File.txt");
   // Добавляем к нему новое из мемо.
   Stirngs.AddStrings(Memo.Lines);
   // Все сохраняем
   Strings.SaveToFile("File.txt");
 finally
   String.Free;
 end;
end;


 
Джо ©   (2006-06-04 22:17) [6]

> [4] vegarulez ©   (04.06.06 22:15)
> Ахха...
> вроде понятно всё. Спасибо большое...
>
> порой в книге така ватка написана... автору отровать бы
> что-нить...

Да просто почитай Справку по TStrings. Это будет и полезно, и увлекательно :)


 
Kolan ©   (2006-06-04 22:21) [7]


> Джо ©   (04.06.06 22:14) [3]

Смотрика мысли совпали. :)


 
vegarulez ©   (2006-06-04 22:21) [8]

Спасички... не знал про, что в спраке искать...Теперь начался увлекательнейший процесс обучения по хелпу... ;)
Всем спасибо тема отпала...


 
Джо ©   (2006-06-04 22:23) [9]

> [7] Kolan ©   (04.06.06 22:21)
> Смотрика мысли совпали. :)

А какие тут могут быть разные мысли? обычная иллюстрация работы с методами TStrings... Просмотрев Хелп по его методам, такой код просто напросился бы сам даже у автора вопроса.


 
Юрий Зотов ©   (2006-06-04 22:42) [10]

> vegarulez ©   (04.06.06 22:15) [4]

> порой в книге така ватка написана... автору отровать бы что-нить...

Не верю, что в книжке не написано по AssignFile, Reset, Rewrite и Append. Так что отрывать кое-что надо кое-каким читателям.


 
Kolan ©   (2006-06-04 22:53) [11]

Чтобы разобраться с работой с фалами оч. советую 1 том книги руководство разработчика. С. Теёкстра и К. Пачеко. Брать тут:
www.podgoretsky.com/ddp.html


 
Галинка ©   (2006-06-05 03:59) [12]

Спасибо...


 
vegarulez ©   (2006-06-05 09:04) [13]

Хорошо. А как допустим просто создать txt Файл без записи в него. Чтоб просто пустой был?
CreateFile(1.txt)?


 
Сергей М. ©   (2006-06-05 10:08) [14]


> как допустим просто создать txt Файл без записи в него.
> Чтоб просто пустой был?


TFileStream.Create("1.txt", fmCreate).Free;


 
vegarulez ©   (2006-06-05 10:19) [15]

to Сергей М.
Спасички. Работаит )


 
Loginov Dmitry ©   (2006-06-05 10:25) [16]

vegarulez ©   (05.06.06 9:04) [13]
Хорошо. А как допустим просто создать txt Файл без записи в него. Чтоб просто пустой был?


Можно так еще:

FileCreate()

или так

CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE,
   0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)

Способов много...


 
vegarulez ©   (2006-06-05 23:12) [17]

теперь возникает другой вопрос...
Сижу вот с исключениями мучаюсь.
Допустим пользователь нажимая кнопку батон1 хочет загрузить в мемо1 из файла...
а файла например ещё нет... ну не создали его ещё...
тут же выскакивает месага что де ошибка такая-то...
Я пытаюсь его отловить и убить, чтобы юзер ничего не видел, и создать этот файл...
но что-то пока ничего не выходит (((
помогите с исключением...

procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
i:integer;
TempStrings: TStrings;
begin
TempStrings := TStringList.Create;
if Memo1.Lines.Count=0 then
  begin
    try
    TempStrings.LoadFromFile("1.txt")
    except
    on E:EFOpenError do
   begin
   TFileStream.Create("1.txt",fmCreate).Free;
   //Memo1.Lines:=TempStrings;
   //TempStrings.Free;
    //exit;

    end;
  //finally
  //TempStrings.Free;
  end;
  end
else
begin
 try
  TempStrings.LoadFromFile("1.txt");
  TempStrings.AddStrings(Memo1.Lines);
  TempStrings.SaveToFile("1.txt");
finally
  TempStrings.Free
  end;
end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.Clear;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if i<>0 then
begin
s:=edit1.Text + " || "+ Edit2.Text + " || "+ edit3.Text;
memo1.Lines[i]:=s;
i:=i+1;
end
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
i:=1;
end;

end.


 
Джо ©   (2006-06-05 23:51) [18]

if FileExists(Filename) then
 ...
else
 ...


 
vegarulez ©   (2006-06-06 00:21) [19]

Спасибо,
но это, всё же, не работа с исключениями...
Я хочу посмотреть как с исключениями работать, хотя бы один рабочий пример, чтоб понять, т.к. они ещё у меня используются в одном месте программы, где я скидываю данные в бд, а связь и доступ к бд не всегда есть, поэтому приходится в текстовик данные сохранять. Так вот при обращении к бд и надо будет использовать исключения, чтоб когда не было доступа, и открытия подключения к бд не произошло, по вызову события чтоб данные автоматом скидывались в текстовик, и естесственно пользователь не видел всяких не нужных и непонятных ему месаг... и ошибок...


 
Сергей М. ©   (2006-06-06 08:46) [20]


> vegarulez ©   (06.06.06 00:21) [19]


Для этого имеется готовое решение - TClientDataSet


 
vegarulez ©   (2006-06-06 09:05) [21]

Так TClientDataSet тоже нуждается в подключении....
А при подключении может выпасть ошибка...
Я использую
SQLConnection + SQLQuery
И делаю вот как

datamodule8.SQLConnection1.Open;  // Открываю соединение
datamodule8.SQLnum.SQL.Clear;      // Очищаю буфер запроса
datamodule8.SQLnum.SQL.Add("INSERT INTO `diski` (`account`, `value`, `product`, `data_in`, `hash` ) VALUES ("+ Form1.edit1.text + Form1.Edit2.Text +", "+ Form2.edit1.text +", ""+ (prd) +"",""+ (strd) +"",""+ (hash) +"")");  // Формирую запрос
datamodule8.SQLQuery.ExecSQL();  // Выполняю запрос

но когда открываешь Open, то при выключенной бд или отсутствующей связи обязательно выскочет исключение.


 
Сергей М. ©   (2006-06-06 09:19) [22]


> TClientDataSet тоже нуждается в подключении.


Вот как раз и не нуждается.
Подключение ему нужно лишь в момент синхронизации изменений в его автономном дейтасете с соотв данными в БД. Автономный же дейтасет м.б. создан методами CreateDataSet (новый), LoadFromFile (ранее сохраненный), по окончанию сессии автономной работы приложения (т.е. сессии без подключения к БД) дейтасет м.б. сохранен в файл для последующей загрузки из этого файла.


 
vegarulez ©   (2006-06-06 09:28) [23]

>Подключение ему нужно лишь в момент синхронизации

Так в этот момент и выскочит месага, что связи нет... В момент синхронизации... мне нужно это отловить.

И при выводе что нет связи сохранит в файл, потом при повторном подключении и отправке следующего запроса, открыть файл и отправить ранее не отправленные данные.

Это одно, а второе мне не надо их хранить, и запршивать всю таблицу и хранить в нём, и изменять её, и синхронизировать изменения...
мне надо просто добавить в таблицу быстро и молниеносно (как серпом по ... МТСу) )))
Без всяких синхронизаций. Однонаправленым запросом.


 
Сергей М. ©   (2006-06-06 09:42) [24]


> vegarulez ©   (06.06.06 09:28) [23]


Ты бы хоть справку почитал что ли .. к этому компоненту ... прежде чем про "серпы" рассуждать ..

Этот компонент сделает все что тебе нужно !


 
Ivolg ©   (2006-06-06 10:53) [25]

Попробуй таким методом:
try
datamodule8.SQLConnection1.Open;  
datamodule8.SQLnum.SQL.Clear;
datamodule8.SQLnum.SQL.Add("INSERT INTO `diski` (`account`, `value`, `product`, `data_in`, `hash` ) VALUES ("+ Form1.edit1.text + Form1.Edit2.Text +", "+ Form2.edit1.text +", ""+ (prd) +"",""+ (strd) +"",""+ (hash) +"")");  
datamodule8.SQLQuery.ExecSQL();
except
ShowMessage("Ошибка подключения к БД");
Memo1.Lines.SaveToFile("db.txt");
end;


 
vegarulez ©   (2006-06-06 11:29) [26]

2 Ivolg ©  
Мне как раз таки и не надо выводить месаг и прочих сообщений...
Я об этом писал выше... Юзер не должен видеть сообщений об ошибках и прочей ерунды. Всё должно записаться в файл и при повторном подключении прочесться от туда и записаться в бд.

2 Сергей М. ©  
Тока начал читать...
У тебя есть какие-нить примеры к этому компоненту?
Дай ссыль...


 
Сергей М. ©   (2006-06-06 15:17) [27]


> Дай


Они у тебя перед носом - в демо-проектах в штатной поставке Делфи.


 
Ivolg ©   (2006-06-06 21:58) [28]

>vegarulez ©
Мне как раз таки и не надо выводить месаг и прочих сообщений...
Я об этом писал выше... Юзер не должен видеть сообщений об ошибках и прочей ерунды. Всё должно записаться в файл и при повторном подключении прочесться от туда и записаться в бд.


А кто тебе мешает удалить функцию, которая выводит сообщение ?
ShowMessage("Ошибка подключения к БД");(


 
Ivolg ©   (2006-06-06 21:58) [29]

>vegarulez ©
Мне как раз таки и не надо выводить месаг и прочих сообщений...
Я об этом писал выше... Юзер не должен видеть сообщений об ошибках и прочей ерунды. Всё должно записаться в файл и при повторном подключении прочесться от туда и записаться в бд.


А кто тебе мешает удалить функцию, которая выводит сообщение ?
ShowMessage("Ошибка подключения к БД");(


 
Ivolg ©   (2006-06-06 22:00) [30]

Извеняюсь за флуд, у меня что-то лагнуло...


 
vegarulez ©   (2006-06-06 22:00) [31]

Пытаюсь так сделать - ругается... (
Как правильно прописать?
Помоги...

procedure TForm2.Button1Click(Sender: TObject);
begin
form2.SQLClientDataSet1.CommandText:="INSERT INTO `diski` (`account`, `value`, `product`, `data_in`, `hash` ) VALUES ("+ Form1.edit1.text + Form1.Edit2.Text +", "+ Form2.edit1.text +", ""+ (prd) +"",""+ (strd) +"",""+ (hash) +"")";
Form2.SQLClientDataSet1.SaveToFile("123.bin",dfBinary);
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
Form2.SQLClientDataSet1.LoadFromFile("123.bin");
Form2.SQLClientDataSet1.Active:=true;
end;


 
Ivolg ©   (2006-06-06 22:09) [32]

>vegarulez ©

Ругается где ? При самом запросе или при подключении ?


 
vegarulez ©   (2006-06-06 22:16) [33]

Млин... наконец-то понял... вот я тупень...
просто когда запускал в делфи и не копилял в ехе он всегда выводил exception сообщение... и я его пытался выловить и убить чтоб оно не появлялось...
И никак не понимал, как это люди говорят, что работает и нет месаг всяких, а у меня работает и при исключении вываливается всегда месага...
блин... Оказывается просто в exe компильнуть нуно было...

спасибо Ivolg ©.. вразумил...

Тяжело в лечении, легко в раю... (с)


 
Ivolg ©   (2006-06-06 22:18) [34]

>vegarulez ©

Пожайлуста...


 
vegarulez ©   (2006-06-06 22:19) [35]

Раннее спасибо написал, за то что относилось к SQLQuery + SqlConnection понял что почём.

Теперь про использование SQLClientDataSet1...

Ругается, что де не могу загрузить с файла... так как файл он походу не создаёт т.к. его нет в директории с проектом..
естественно загрузить с него тоже не может так как его нет...


 
vegarulez ©   (2006-06-06 22:28) [36]

Ругается также при самом запросе, что Cursor not returned from Query... так запрос скорее всего однонаправленный... ничего не возвращающий...


 
Сергей М. ©   (2006-06-07 10:52) [37]


> загрузить с него тоже не может так как его нет


Так создай !

На то тебе и даны методы SaveToFile(), SaveToStream()



Страницы: 1 вся ветка

Текущий архив: 2006.06.25;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.03 c
1-1147277774
swan
2006-05-10 20:16
2006.06.25
ПИД-регулирование


15-1148779516
TODE
2006-05-28 05:25
2006.06.25
Как запихнуть такую процедуру в класс, чтобы небыло ошибки?


15-1148989599
RomanH
2006-05-30 15:46
2006.06.25
SQL сервер TransBase


2-1149700164
SUCUBE
2006-06-07 21:09
2006.06.25
Oшибка


15-1149163564
tvv
2006-06-01 16:06
2006.06.25
Работа с TBitmap-ом