Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TWriter [D6, Win2k]


Страницы:   1 2

Alibaba ©   (2002-05-21 17:51:00) 

Всем привет!
Подскажите плиз, как работать с TWriter?
У меня есть lst: Tlist как можно с помощью TWriter сохранить содержимое lst в файл?


Serhy   (2002-05-23 01:56:00) [1]

2 Alibaba © (22.05.02 17:05)
>>Digitman
>В ожидании никто не парился.
>Шел интенсивный поиск разных путей достижения цели.
И сколько "Бочкаревых" в этом поиске полегло?


Digitman   (2002-05-22 17:16:00) [2]

>Alibaba

Что ж ... так - значит, так)


Alibaba   (2002-05-22 17:05:00) [3]

>Digitman
В ожидании никто не парился.
Шел интенсивный поиск разных путей достижения цели.
И поиск еще не закончен.
Интерестно не просто решить задачу - а решить её самым ефективным способом.
А форум тем и интересен что можно услышать много различных мнений по одному вопросу.
Иногда встречаются даже полезные :)


Digitman   (2002-05-22 16:41:00) [4]

>Alibaba

В хэлп слазил-бы - давно б сам нарисовал и не парился в ожидании, что разжуют) ...ведь и примеры использования DefineProperties() и Reader/Writer там есть тоже !


Alibaba   (2002-05-22 16:25:00) [5]

>Digitman
Спасибо. Это действительно то что мне надо!


yaJohn   (2002-05-22 15:06:00) [6]

Не хочу вмешиваться в вашу дискуссию, но молодому другу сорока разбойников возможно следует обратить взор к TCollection.
А лучше к TOwneredCollection (кажется так, все время забываю как она пишется). Если создать класс - наследник TComponent с published свойством TOwneredCollection, то этот компонент можно вполне успешно записывать и читать в/из потока (например файлового), причем коллекция вместе со всеми ее элементами будет очень аккуратно сохранена/востановлена.


Digitman   (2002-05-22 13:39:00) [7]

поправка "ляпа":

procedure TMyList.WriteList(Writer: TWriter);



Digitman   (2002-05-22 13:35:00) [8]

Насколько я понял то, тебе нужно реализовать примерно следующее:


type

PWFile = ^TWFile;
TWFile = record
i: integer;
s: string;
end;

TMyList = class(TComponent)
private
FList: TList;
procedure ClearList;
protected
procedure DefineProperties(Filer: TFiler); override;
procedure ReadList(Reader: TReader);
procedure WriteList(Reader: TWriter);
public
constructor Create(AOwner: TComponent);
destructor Destroy; override;
function AddItem(IntField: Integer; StrField: String): Integer;
procedure RemoveItem(ItemIndex: Integer);
end;

implementation

constructor TMyList.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FList := TList.Create;
end;

destructor TMyList.Destroy;
begin
ClearList;
FList.Free;
inherited Destroy;
end;

procedure TMyList.ClearList;
var
i: Integer;
begin
for i := 0 to FList.Count - 1 do
FreeMem(FList[i]);
FList.Clear;
end;

function TMyList.AddItem(IntField: Integer; StrField: String): Integer;
var
pRec: PWFile;
begin
GetMem(pRec, SizeOf(TWFile);
try
pRec.i := IntField;
pRec.s := StrField;
Result := FList.Add(pRec);
except
FreeMem(pRec);
raise;
end;
end;

procedure TMyList.RemoveItem(ItemIndex: Integer);
begin
FreeMem(FList[i]);
FList.Delete(i);
end;

procedure TMyList.DefineProperties(Filer: TFiler);
begin
inherited;
Filer.DefineProperty("ListData", ReadList, WriteList, True);
end;

procedure TMyList.ReadList(Reader: TReader);
begin
ClearList;
with Reader do begin
ReadListBegin;
while not EndOfList do
AddItem(ReadInteger, ReadString);
ReadListEnd;
end;
end;

procedure TMyList.WriteList(Reader: TWriter);
var
k: Integer;
begin
with Writer do begin
WriteListBegin;
for k := 0 to FList.Count - 1 do
with PWFile(FList[k])^ do
begin
WriteInteger(i);
WriteString(s);
end;
WriteListEnd;
end;
end;




Alibaba   (2002-05-22 12:31:00) [9]

>Digitman

Мы говорим о разных вещах.
Я ЗНАЮкак решить свой вопрос МЕТОДОМ №1:
Описать тип, создать типизированный файл и писать/читать переменные этого типа из типизированного файла.
этот метод не обсуждается
-----------------------------------------------------------------
в форум я пришел что-бы обсудить другой метод, который я не знаю
Я НЕ ЗНАЮкак решить свой вопрос МЕТОДОМ №2:
используя TReader/TWriter или что-то другое что лучше всего подходит.
-----------------------------------------------------------------
И так, проблема вкратце. (еще раз :))
Есть некий обьект, который содержит, на-пример, два поля:
TWFile = record
i: integer;
s: string;
end;
Я хочу:
1.Использовать список для работы с набором этих обьектов.
lst : TList;
2.По окончании работы сохранять в файл содержимое lst, а перед началом работы, соответственно, читать из файла в lst.

КАК ЭТО СДЕЛАТЬ ЛУЧШЕ ВСЕГО?
Если есть пример кода - покажите, буду очень благодарен.


Digitman   (2002-05-22 12:06:00) [10]

>Alibaba

Тогда тебе придется написать собственный класс, унаследованный от TComponent, переопределив в нем вирт.метод DefineProperties(). Именно он работает с файлером (который, в свою очередь, автоматически создает объекты класса TReader/TWriter для чтения/записи твоего объекта в поток).
Но в этом случае твой типизированный файл придется скомкать и выбросить в мусор, потому как файлер работает со своим собственным форматом данных в потоке (TPF#1).


Alibaba   (2002-05-22 10:56:00) [11]

>Digitman
>Ты что в файл сохранять-то собрался ? Указатели ?

Нет, зачем-же?
Я описал тип (смотри Alibaba (21.05.02 18:56))
создал типизированный файл
и в этот типизированный файл сохраняю переменные этого типа.


KilkennyCat   (2002-05-22 10:53:00) [12]

за чем же на анекдоты наезжать? мне понравилось, спасибо!


Alibaba   (2002-05-22 10:49:00) [13]

2Cobalt
Анекдоты травят в другом разделе.


Alibaba   (2002-05-22 10:48:00) [14]

2Serhy
Про ПОЕЗД это смешно, да. Главное в тему.
Если бы все пользовались самыми простыми решениями то до сих пор бы програмировали на Turbo Pascal.
Но нет-же усложняют себе жизнь люди!
Придумали зачем-то Delphi...
Я думаю что прогресс, развитие происходит не для того что-бы отойти от простых решений и использовать сложные - а для расширения функциональности!
Что-бы новые решения позволяли делать БОЛЬШЕ и ЛУЧШЕ!


Digitman   (2002-05-22 08:37:00) [15]

>Alibaba
Ты что в файл сохранять-то собрался ? Указатели ?


arbiter   (2002-05-22 07:05:00) [16]

никак!

во первых TWriter предназначен совсем для другого, для чего читай в хелпе.
а для сохраниния объекта нужно использовать TStream.ReadComponent и TStream.WriteComponent.

Обычный класс сохранить нельзя, вся логика по сохраниню объекта реализована только в классе TPersistent и соответсвенно его потомках.
Но даже если ты унаследуешь свой класс от TPersistent в твоём примере тебе это не поможет, поскольку сохраняются только published свойства, а никак не внутреннее состояние объекта.


Serhy   (2002-05-22 02:02:00) [17]

2 Alibaba © (21.05.02 18:56)
> НО МНЕ НЕ ПОДХОДИТ САМОЕ ПРОСТОЕ РЕШЕНИЕ.

Q. Каким поездом можно добраться из Москвы в Нью-Йорк?
A. Воспользуйся Аэрофлотом
Q. Нет. Аэрофлот - это слишком простое решение! Мне нужно ИМЕННО ПОЕЗДОМ!
A. ?????


Cobalt   (2002-05-21 20:16:00) [18]

Молодой человек, не надо так нервничать, а то с сердцем плохо станет...
Попробуйте почитатать справку по этому классу (я, кажется, видел его в хелпе), попробуйте поработать, а, буде не получится, спрашивайте конкретные вопросы.

Однажды некий бородатый сисадмин, сидя дома на больничном, занимался чтением какой-то полуметровой доки. К нему подошел его сын-первоклассник и спросил:
- Папа, а как устроен телевизор?
- RTFM! - отмахнулся сисадмин.
Дитя вздохнуло и привычно поинтересовалось - man что?


Alibaba   (2002-05-21 18:56:00) [19]

????
Я ОЧЕНЬ удивлен Вашим ответом.
Мне кажется, что мастера Дельфи не могут давать такие рекомендации (имеется ввиду НАСТОЯЩИЕ МАСТЕРА с золотым значком)

Я описал тип TWFile не для того что-бы записывать в файл отдельные поля!

САМОЕ ПРОСТОЕ решение в этом случае:

type
TWFile = record
SrcPath: ShortString;
DstPath: ShortString;
moving: boolean;
WaitMin: byte;
WaitSec: byte;
NumTry: byte;
end;

var
p: TWFile;
f: file of TWFile;

begin
AssignFile(f,"c:\a.txt");
ReWrite(f);
p.SrcPath:="тра-ля-ля";
...
Write(f,p);
CloseFile(f);
end;

НО МНЕ НЕ ПОДХОДИТ САМОЕ ПРОСТОЕ РЕШЕНИЕ.

Я хочу создать не record a class и работать со списком.


MBo   (2002-05-21 18:34:00) [20]

думаю, TWriter тебе ни к чему - это для сохранения свойств компонентов.
Здесь же просто сделай процедуру SaveToFile и пиши последовательно все поля. перед полями переменной длины записывай эту длину. при восстановлении наоборот.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо