IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Сохранение данных Memo, ...в файл *.txt без SaveDialog
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 105
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


Не получается unsure.gif

С SaveDialog получается, но...

Задача на потоки. В одном из потоков необходимо данные Memo сохранять в текстовый файл. Как?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +


Вот мой вариант работы с нитками (так называть предпочтительнее потому как может возникнуть путаница со стримами):
Исходный код

// решение классической задачи о поставщике
// и получателе (в классическом варианте используются
// два семафора)

const
//имя файла, куда будем сохранять
RECORD_FILE = 'file.txt';


// класс нашей записи
type
TSaveRecord = class
private
fLine: string;
public
constructor Create;
property Line: string read fLine;
end;//of class


// в конструкторе втупую создаём новую строку
// ты можешь заменить на всё, что тебе нужно

var i: integer = 1;
constructor TSaveRecord.Create;
begin
fLine:='Text record #'+IntToStr(i);
inc(i);
end;

var
// текущая запись
Rec: TSaveRecord = nil;

// это специальный объект, который позволяет синхронизировать
// чтение/запись в переменную Rec
Mtx: TMultiReadExclusiveWriteSynchronizer;


// наш потребитель - получает новую запись
// и сохраняет в файл
type
TRecordSaver = class(TThread)
private
fStream: TStream;
procedure UpdateMemo;
procedure WriteRec;
public
procedure Execute; override;
end;//of class


// процедура отображает новую запись в Memo
// компонент на форме
procedure TRecordSaver.UpdateMemo;
begin
Form1.Memo1.Lines.Add(Rec.Line);
end;

// процеура чтения новой записи
procedure TRecordSaver.WriteRec;
var S: string;
begin
// бликируем Rec для изменения из поставщика
Mtx.BeginRead;
try
if Rec = nil then Exit; // переходим к блоку finally если Rec пуста
// пишем в файл
S:=Rec.Line+#13#10;
fStream.WriteBuffer(pointer(S)^,Length(S));

//отображаем в Мемо
Synchronize(UpdateMemo);

// Rec нам больше не нужна
FreeAndNil(Rec);
finally
// не забываем разблокировать
Mtx.EndRead;
end;
end;

procedure TRecordSaver.Execute;
begin
// открываем файл для записи
fStream:=TFileStream.Create(RECORD_FILE,fmCreate or fmOpenWrite);
try
while not Terminated do begin
WriteRec;
// небольшая задержка
Sleep(100);
end;
finally
fStream.Free;
end;
end;


// наш поставщик
type
TRecordGenerator = class(TThread)
private
procedure GenerateRec;
protected
procedure Execute; override;
end;//of class

procedure TRecordGenerator.GenerateRec;
begin
// блокируем Rec для чтения из другого потока
Mtx.BeginWrite;
try
// создаём новую запись
if Rec = nil then // предыдущая запись прочитана
Rec:=TSaveRecord.Create;
finally
// снимаем блокировку
Mtx.EndWrite;
end;
end;

procedure TRecordGenerator.Execute;
begin
while not Terminated do begin
GenerateRec;
// опятьже задержка
Sleep(100);
end;
end;

var
Saver: TRecordSaver;
Generator: TRecordGenerator;

procedure TForm1.FormCreate(Sender: TObject);
begin
// создали синхронизатор
Mtx:=TMultiReadExclusiveWriteSynchronizer.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Button2.Click;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
//защита от дурака
if (Saver <> nil) or (Generator <> nil) then Exit;

// создали потребителя
Saver:=TRecordSaver.Create(true);

// создали пославщика
Generator:=TRecordGenerator.Create(true);

Memo1.Clear;

// поехали!!!
Saver.Resume;
Generator.Resume;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
// уничтожаем поставщика
if Generator <> nil then begin
Generator.Terminate;
Generator.WaitFor;
FreeAndNil(Generator);
end;
// уничтожаем потребителя
if Saver <> nil then begin
Saver.Terminate;
Saver.WaitFor;
FreeAndNil(Saver);
end;
end;

На форму положить: Memo - 1 штук; Button - 2 штуки; также подсоединить событие создания формы и разрушения (в моем коде они определены)

Сообщение отредактировано: volvo -


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Jill   Сохранение данных Memo   30.03.2006 17:44
hiv   Примерно так:var fs:TFileStream; ... begin ... …   30.03.2006 18:02
Jill   hiv, заморочка у меня такая: где именно вписыват…   30.03.2006 18:06
hardcase   Зачем объявлять файл? Файлы (file of ...) остались…   30.03.2006 20:46
Jill   hardcase, файл должен сохранятся по умолчанию по…   31.03.2006 13:33
hiv   hardcase, файл должен сохранятся по умолчанию п…   31.03.2006 17:16
#$# PaVeL #$#   По моему лучше сделать так: Memo1.Lines.SaveToFile…   31.03.2006 15:46
Jill   запускается... тока перестает реагировать на кноп…   31.03.2006 16:55
Jill   ребят, мне необходимо сохранять файл ПО УМОЛЧАНИЮ,…   31.03.2006 17:35
hiv   Мы тут не занимаемся спиритизмом! Давай код в…   31.03.2006 19:02
Jill   ок :) просто код длинноват: unit Unit1; interfa…   31.03.2006 19:16
hardcase   Хм. Код конечно странный. Сейчас посмотрел. Когда …   31.03.2006 20:02
Jill   Постановка задачи: Написать программу, которая фор…   31.03.2006 20:09
volvo   Значит, мало съел! Придется повторить трапезу.…   31.03.2006 20:54
hardcase   Вот мой вариант работы с нитками (так называть пре…   1.04.2006 3:47
hiv   Если надо использовать метод Synchronize, то вот т…   3.04.2006 14:26
Jill   спасибо всем :) за помощь, примеры и варианты от…   3.04.2006 15:43


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

 





- Текстовая версия 8.05.2024 1:18
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name