Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объект в Stream, для сохранения 
:(
    Опции темы
Rodman
Дата 9.8.2007, 17:54 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



Дароф...

есть компонент TSimpleGraph - мне нужно сохранить все что на нем находится в Stream для последующего сохранения в файл...

Как это сделать???

Сенкс
PM MAIL WWW Skype GTalk YIM MSN   Вверх
BaD_SeCt0R
Дата 9.8.2007, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lazy Coder
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 9.10.2006
Где: Анапа

Репутация: 4
Всего: 18



Тут Snowy уже поднимал подобную тему. Глянь

http://forum.vingrad.ru/topic-94245/view-all.html


--------------------
Кто владеет информацией - владеет миром. (С) Френсис Бэкон.
PM MAIL ICQ   Вверх
Alexeis
Дата 10.8.2007, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Rodman, что это за штука такая TSimpleGraph? Дело в том, что если сериализовать в лоб, то может не все сохраниться. Ведь не все нужные свойства находятся в секции published.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
BaD_SeCt0R
Дата 10.8.2007, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lazy Coder
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 9.10.2006
Где: Анапа

Репутация: 4
Всего: 18



Цитата(Alexeis @  10.8.2007,  00:02 Найти цитируемый пост)
Ведь не все нужные свойства находятся в секции published


Ну так написать потомка и все проперты, которые нужны в нем распаблишить... Я так понимаю, что названый компонент - потомок TGraphicControl?


--------------------
Кто владеет информацией - владеет миром. (С) Френсис Бэкон.
PM MAIL ICQ   Вверх
Snowy
Дата 10.8.2007, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Rodman @  9.8.2007,  17:54 Найти цитируемый пост)
есть компонент TSimpleGraph - мне нужно сохранить все что на нем находится в Stream
Ну так SaveToStream...


Цитата(Rodman @  9.8.2007,  17:54 Найти цитируемый пост)
для последующего сохранения в файл...
Ну так сразу TFileStream...
PM MAIL   Вверх
Rodman
Дата 13.8.2007, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



Суть в том что надо реализовать следующее: сохранение нескольких схем и потом загрузка. 

т.е. есть несколько схем (допустим 3), в цыкле могу сохранить каждую схему в отдельный файл, но для себя могу взять поток (каждой схемы) который сохраняется. так вот нужно их все один файл закинуть, через какой то разделитель, чтоб потом их загрузить можно было (теже 3 схемы) на отдельную закладку каждую...

какую технологию можете предложить???
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Snowy
Дата 13.8.2007, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



А сегодня, дети, я научу вас, как сохранять несколько компонентов в один файл, а потом прочитать их оттуда.
В качестве примера, создадим тестовую формочку. Бросим на неё 2 кнопочки и 4 едитика...
Далее пропишем следующий кодик:
Код
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

  TReader = class(Classes.TReader) end; // вскрываем TReader (ну как без этого...)
 
var Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  w:  TWriter;
  fs: TFileStream;
begin
  try
    fs := TFileStream.Create('C:\save.dat', fmCreate); // создаём файлик
    w := TWriter.Create(fs, 32); // создаём врайтер
    try
      w.WriteComponent(Edit1); // пишем во врайтер наши компонентики. По сути можно любые.
      w.WriteComponent(Edit2);
      w.WriteComponent(Edit3);
      w.WriteComponent(Edit4);
      w.WriteListEnd; // а тут ставим отметочку окончания списка
       // если очень хочется, то дальше можем записать любые другие данные во writer. Они уже не помешают.
    finally
      w.Free; fs.Free;
    end;
  except
    // ошибка записи на диск
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  r:  TReader;
  fs: TFileStream;
  n:  string;
  c:  TComponent;
begin
  try
    fs := TFileStream.Create('C:\save.dat', fmOpenRead); // открываем файлик
    r := TReader.Create(fs, 1); // создаём ридер
    try
      while not r.EndOfList do // читаем компонентики, пока не найдём отметку конца списка
      begin
        r.ReadStr; n := r.ReadStr; // читаем имя класса и имя компонента. Имя класса нам не нужно.
        c := FindComponent(n); // ищем на форме компонент с нашим именем
        if c = nil then Exit; // если нет - плохой файлик, не надо нам такого
        while not r.EndOfList do // читаем все проперти файлика
        try
          r.ReadProperty(c);
        finally end;
        r.ReadListEnd; r.ReadListEnd; // забираем отметочки об окончании записи компонента
    end;
    finally
      r.Free; fs.Free;
    end;
  except
    // ошибка чтения
  end;
end;

PM MAIL   Вверх
Rodman
Дата 14.8.2007, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



так вроде должно быть?!
Код

if c = nil then Exit;


но... он то сохраняет только компонент, а вот все что на нем не хочет (хотя текст в эдитах сохранил).


Цитата(Alexeis @  9.8.2007,  23:02 Найти цитируемый пост)
Rodman, что это за штука такая TSimpleGraph?
http://www.delphiarea.com/products/simplegraph/

у меня есть идея объединить файлы в один, т.к. отдельно каждый объект с схемами на нем сохраняется в бинарик (см. приложение)...

можно ли как нить объединить??7 чтоб потом можно было разделить на подобные файлы для загрузки??? 


Это сообщение отредактировал(а) Rodman - 14.8.2007, 17:19

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  File.sgp 0,19 Kb
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Snowy
Дата 14.8.2007, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Rodman @  14.8.2007,  17:18 Найти цитируемый пост)
так вроде должно быть?!
Меткий глас. Точно - очипятка ;-)

Цитата(Rodman @  14.8.2007,  17:18 Найти цитируемый пост)
но... он то сохраняет только компонент, а вот все что на нем не хочет (хотя текст в эдитах сохранил).
Там обычный SaveComponent.
Если сохраняет отдельно, то и вместе будет.
Если нет - компонент кривой.
PM MAIL   Вверх
Rodman
Дата 14.8.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



Цитата(Snowy @  14.8.2007,  16:48 Найти цитируемый пост)
Если сохраняет отдельно, то и вместе будет.

а как можно открыть файл (несколько бинариков по типу прикрепленного) и сохранить в один... хотел обычным TStringList, но только часть текста берет, я так думаю что при помощи какого то Stream'a надо делать?!

Как???

Добавлено через 2 минуты и 16 секунд
наверно же и какой то разделитель надо!!!
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Snowy
Дата 14.8.2007, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Несколько стримов в файл загнать легко.
Это как передача стрима по сети.
Пишешь в файл сначала длину стрима, потом сам стрим и т.д. по кругу.
При чтении наоборот - сначала читаешь длину стрима, потом данное кол-во байт в стрим и т.д. в цикле, пока не дойдёшь до конца файла.
PM MAIL   Вверх
Rodman
Дата 14.8.2007, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



а где можно пример глянуть?
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Snowy
Дата 14.8.2007, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Блин, ты вынуждаешь меня писать код, когда я пиво пью... smile
Держи раздельное сохранение стримов.
Код
procedure TForm1.Button1Click(Sender: TObject);
  procedure AddStream(InSt, OutSt: TStream);
  var
    d: dword;
    s: string;
  begin
    InSt.Position := 0;
    d := InSt.Size; OutSt.Write(d, SizeOf(d));
    SetLength(s, d); InSt.Read(s[1], d);
    OutSt.Write(s[1], d); InSt.Size := 0;
  end;
var
  fs: TFileStream;
  ms: TMemoryStream;
begin
  fs := TFileStream.Create('C:\save.dat', fmCreate);
  ms := TMemoryStream.Create;
  ms.WriteComponent(Edit1); AddStream(ms, fs);
  ms.WriteComponent(Edit2); AddStream(ms, fs);
  ms.WriteComponent(Edit3); AddStream(ms, fs);
  ms.WriteComponent(Edit4); AddStream(ms, fs);
  fs.Free; ms.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
  procedure LoadStream(InSt, OutSt: TStream);
  var
    d: dword;
    s: string;
  begin
    OutSt.Size := 0;
    InSt.Read(d, SizeOf(d)); SetLength(s, d); InSt.Read(s[1], d);
    OutSt.Write(s[1], d); OutSt.Position := 0;
  end;
var
  fs: TFileStream;
  ms: TMemoryStream;
begin
  fs := TFileStream.Create('C:\save.dat', fmOpenRead or fmShareDenyWrite);
  ms := TMemoryStream.Create;
  LoadStream(fs, ms); ms.ReadComponent(Edit1);
  LoadStream(fs, ms); ms.ReadComponent(Edit2);
  LoadStream(fs, ms); ms.ReadComponent(Edit3);
  LoadStream(fs, ms); ms.ReadComponent(Edit4);
  ms.Free; fs.Free;
end;

PM MAIL   Вверх
sentry
Дата 14.8.2007, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Code Monkey
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 29.1.2007
Где: Москва

Репутация: 2
Всего: 10



Примите мой вклад smile Пример конечно далеко не идеален, но все же демонстрирует запись того, что нужно...
Код

  TField = (fOne, fTwo, FThree);

  TMyButton = class (TButton)
  private
    Field1: TField;
    procedure ReadField1(Reader: TReader);  // используются в
    procedure WriteField1(Writer: TWriter); // DefineProperties
  protected
    procedure DefineProperties(Filer: TFiler); override; // для записи Field1
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses TypInfo; // для наглядности, ибо есть перечислимый тип

  { сохранение в файл read/write published св-в и псевдосвойтсв }
procedure SaveToFile(RootObject: TComponent; const FileName: TFileName);
var
  FileStream: TFileStream;
  MemStream: TMemoryStream;
begin
  FileStream := TFileStream.Create(FileName, fmCreate);
  MemStream := TMemoryStream.Create;
  try
    MemStream.WriteComponent(RootObject);
    MemStream.Position := 0;
    ObjectBinaryToText(MemStream, FileStream); // а это чтоб в блокноте
                                               // смотреть можно было, как
                                               // форму dfm
  finally
    MemStream.Free;
    FileStream.Free;
  end;
end;

  { естественно, загружаем взад }
procedure LoadFromFile(RootObject: TComponent; const FileName: TFileName);
var
  FileStream: TFileStream;
  MemStream: TMemoryStream;
begin
  FileStream := TFileStream.Create(FileName, 0);
  MemStream := TMemoryStream.Create;
  try
    ObjectTextToBinary(FileStream, MemStream);
    MemStream.Position := 0;
    MemStream.ReadComponent(RootObject);
  finally
    MemStream.Free;
    FileStream.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Btn: TMyButton;
begin
  Btn := TMyButton.Create(Form1);
  Btn.Name := 'Btn1';
  Btn.Caption := 'MyButton';
  Btn.Field1 := fTwo;
  Btn.Parent := Form1;
    // смотрим наше св-во
  ShowMessage(GetEnumName(TypeInfo(TField), Integer(Btn.Field1)));
  SaveToFile(Btn, 'C:\MyBtn.dat');
    // удаляем, чтобы конфликтов имен не было
  Btn.Free;
  Button1.Enabled := False;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Btn: TMyButton;
begin
  Btn := TMyButton.Create(Form1);
  LoadFromFile(Btn, 'C:\MyBtn.dat');
  Btn.Parent := Form1;
    // осталось таким же?
  ShowMessage(GetEnumName(TypeInfo(TField), Integer(Btn.Field1)));
    // круто! оно самое ;)
  Button2.Enabled := False;
end;

{ TMyButton }

  { определяем еще одно св-во для записи при сериализации }
procedure TMyButton.DefineProperties(Filer: TFiler);
begin
  Filer.DefineProperty('Field1', ReadField1, WriteField1, True);
end;

procedure TMyButton.ReadField1(Reader: TReader);
begin
  Field1 := TField(GetEnumValue(TypeInfo(TField), Reader.ReadIdent));
end;

procedure TMyButton.WriteField1(Writer: TWriter);
begin
    // записывать перечислимый тип надо красиво
  Writer.WriteIdent(GetEnumName(TypeInfo(TField), Integer(Field1)));
end;


Конечно, здесь записывается один компонент, и для полного охвата следовало бы еще записывать какую-нибудь панель с кнопочками на ней.

Это сообщение отредактировал(а) sentry - 22.8.2007, 16:40
PM MAIL   Вверх
Rodman
Дата 16.8.2007, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



Цитата(Snowy @  14.8.2007,  17:59 Найти цитируемый пост)
когда я пиво пью..

упс...

ну я щас дошел до того что могу загнать данные каждого компонента в TFileStream. как вот теперь сделать чтобы в цикле я добавлял в бинарик поток каждого компонента и потом мог прочитать???
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0981 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.