Форум: "Основная";
Текущий архив: 2002.06.03;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.007 c