Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-7034
SPeller
2002-05-21 15:32
2002.06.03
Процедурные типы


1-7040
[BAD]Angel
2002-05-21 16:05
2002.06.03
Нужна помощь с динамической загрузкой DLL


3-6942
Olivka
2002-05-11 22:16
2002.06.03
SQL server, установка


3-6925
Rub
2002-05-14 09:51
2002.06.03
Пытаюсь запихать JPEG в поле binary... Проблемы похоже...


4-7266
DNT
2002-04-01 17:24
2002.06.03
Диалог выбора иконки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский