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

Вниз

TWriter   Найти похожие ветки 

 
Alibaba ©   (2002-05-21 17:51) [0]

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


 
MBo ©   (2002-05-21 17:58) [1]

а какое его содержимое?


 
Alibaba ©   (2002-05-21 18:10) [2]

type
TWFile = class
SrcPath: ShortString;
DstPath: ShortString;
moving: boolean;
WaitMin: byte;
WaitSec: byte;
NumTry: byte;
public
constructor Create( чего-то там);
end;

var
lst: TList;

begin
lst:=TList.Create;
//здесь я работаю с TList
lst.Add(TWFile.Create( чего-то там));

//теперь хоче сохранить в файл. Как?
...
end;


 
MBo ©   (2002-05-21 18:34) [3]

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


 
Alibaba ©   (2002-05-21 18:56) [4]

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

Я описал тип 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 и работать со списком.


 
Cobalt ©   (2002-05-21 20:16) [5]

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

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


 
Serhy ©   (2002-05-22 02:02) [6]

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

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


 
arbiter ©   (2002-05-22 07:05) [7]

никак!

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

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


 
Digitman ©   (2002-05-22 08:37) [8]

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


 
Alibaba ©   (2002-05-22 10:48) [9]

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


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

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


 
KilkennyCat ©   (2002-05-22 10:53) [11]

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


 
Alibaba ©   (2002-05-22 10:56) [12]

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

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


 
Digitman ©   (2002-05-22 12:06) [13]

>Alibaba

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


 
Alibaba ©   (2002-05-22 12:31) [14]

>Digitman

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

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


 
Digitman ©   (2002-05-22 13:35) [15]

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


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;





 
Digitman ©   (2002-05-22 13:39) [16]

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

procedure TMyList.WriteList(Writer: TWriter);




 
yaJohn ©   (2002-05-22 15:06) [17]

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


 
Alibaba ©   (2002-05-22 16:25) [18]

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


 
Digitman ©   (2002-05-22 16:41) [19]

>Alibaba

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


 
Alibaba ©   (2002-05-22 17:05) [20]

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


 
Digitman ©   (2002-05-22 17:16) [21]

>Alibaba

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


 
Serhy ©   (2002-05-23 01:56) [22]

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



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

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

Наверх




Память: 0.53 MB
Время: 0.014 c
1-7097
DenNNis
2002-05-22 13:50
2002.06.03
String + Char ????


1-7087
SevaNews
2002-05-22 00:08
2002.06.03
Вопрос по кодировке КАК поменять кодировку с win12 ->KOI8-R?


14-7184
Johnmen
2002-04-23 15:13
2002.06.03
Простенькая задачка для всех


4-7275
ArtGamer
2002-03-30 12:34
2002.06.03
Подскажите, как сделать Drag&Drop?


1-6979
ga3
2002-05-22 22:43
2002.06.03
Возведение в степень