С SaveDialog получается, но...
Задача на потоки. В одном из потоков необходимо данные Memo сохранять в текстовый файл. Как?
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.
| Jill |
Сообщение
#1
|
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 105 Пол: Женский Реальное имя: Юлия Репутация: 0 |
Не получается
С SaveDialog получается, но... Задача на потоки. В одном из потоков необходимо данные Memo сохранять в текстовый файл. Как? |
![]() ![]() |
| hardcase |
Сообщение
#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 - -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
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
hiv Если надо использовать метод Synchronize, то вот т… 3.04.2006 14:26
Jill спасибо всем :) за помощь, примеры и варианты
от… 3.04.2006 15:43![]() ![]() |
|
Текстовая версия | 7.11.2025 18:16 |