Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];

Вниз

Как создать фай *.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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.01 c
3-1146207610
Некто
2006-04-28 11:00
2006.06.25
X*Y*H


15-1148874779
Мурзилка
2006-05-29 07:52
2006.06.25
подправить винду :)


8-1137680930
misha_gr
2006-01-19 17:28
2006.06.25
Странная проблема с DsPack


3-1146563515
yurant
2006-05-02 13:51
2006.06.25
SQL-запрос


1-1147543175
RUNaum
2006-05-13 21:59
2006.06.25
Перенос и отлов панели.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский