Модераторы: 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   Вверх
Rodman
Дата 16.8.2007, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


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

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



т.е. программа может сохранить компонент с объектами на нем только по текущей странице на PageControl...

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

ЗЫ: что то запутали меня эти потоки.
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Rodman
Дата 18.8.2007, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


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

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



Код

procedure TSimpleGraph.SaveToFile(const Filename: String):TFileStream;
var
  Stream: TFileStream;
begin
  Stream := TFileStream.Create(Filename, fmCreate or fmShareExclusive);
  try
    SaveToStream(Stream);
    Result:=Stream;
  finally
    Stream.Free;
  end;
end;


почему то не возвращает значение... после Stream.Free result тоже обнуляется!
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Snowy
Дата 18.8.2007, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Rodman @  18.8.2007,  15:08 Найти цитируемый пост)
после Stream.Free result тоже обнуляется!
Ну разумеется.
Ты ж сам убил объект...
Объект один. Ссылки две.
Если убиваешь по одной ссылке, то ничего удивительного, что по второй он тоже мёртв.
PM MAIL   Вверх
Rodman
Дата 20.8.2007, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


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

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



Понял... я вышел из ситуации...

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


Эксперт
****


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

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



Нет, они ж не фиксированного размера.
Если только ты изначально не пропишешь это число в файл.
А так - только последовательным чтением, пока не доберёшься до конца файла.
PM MAIL   Вверх
Rodman
Дата 20.8.2007, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


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

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



ну а например можно как нить это обозначить (в заголовке файла - не в самом имени а в самом файле)??? чтоб потом я по нему мог определить, т.к. если в файле один компонент записан - LoadStream ругается

вот модернизированная процедура
Код

function TMainForm.LoadStream(InSt, OutSt:TStream):Boolean;
var d, saveD:DWORD;
    s:String;
begin
  saveD:=d;
  OutSt.Size:=0;
  InSt.Read(d, sizeof(d));
  SetLength(s, d);//  <-тут ругается мол - "Out of memory.", а если в файле несколько компонентов проходит отлично!!!
  if(d=saveD)then //это сравнения для того чтобы выходить когда закончится список компонентов в файле (с несколькими файлами замечательно работать)
  begin
    Result:=False;
    Exit;
  end
  else
    Result:=True;
  InSt.Read(s[1], d);
  OutSt.Write(s[1], d);
  OutSt.Position:=0;
end;

как это вылечить?
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Snowy
Дата 20.8.2007, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Rodman @  20.8.2007,  10:53 Найти цитируемый пост)
  SetLength(s, d);//  <-тут ругается мол - "Out of memory.", а если в файле несколько компонентов проходит отлично!!!  if(d=saveD)then //это сравнения для того чтобы выходить когда закончится список компонентов в файле (с несколькими файлами замечательно работать)  begin    Result:=False;    Exit;  end
Поменяй местами!
Сначала проверяй, а потом уже выделяй память, если всё нормально.
PM MAIL   Вверх
Rodman
Дата 20.8.2007, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


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

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



Цитата(Snowy @  20.8.2007,  10:01 Найти цитируемый пост)
Поменяй местами!

они получаются разные,  поэтому все проходит далее...

если d не такое как сначала значит че то считует, но блин ругается что не может прочитать...

что ему сделать?

ЗЫ:местами поменял...

Добавлено через 8 минут и 8 секунд
может как нить Except можно выловить отсюда?!

Это сообщение отредактировал(а) Rodman - 20.8.2007, 11:43
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Snowy
Дата 20.8.2007, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Сампл выложи. 
Чего хоть делаешь-то. Непонятно.
PM MAIL   Вверх
Rodman
Дата 20.8.2007, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


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

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



надо сделать заголовок файла и туда все записывать!
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Samurai_I
Дата 20.8.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

procedure TForm1.Button2Click(Sender: TObject);
begin
  MyFileStream := TFileStream.Create('kokojamba.tru',fmCreate,fmShareDenyNone);
  MyFileStream.WriteComponent(ListBox1);
  MyFileStream.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 ReadStream : TFileStream;
 CustomListBox  : TListBox;
begin
  Randomize;
  ReadStream := TFileStream.Create('kokojamba.tru',fmOpenRead,fmShareDenyNone);
  CustomListBox := ReadStream. ReadComponent(nil) as TListBox;
  CustomListBox.Parent := Form1;
  CustomListBox. Left := CustomListBox. Left + Random(200);
  CustomListBox. Top := CustomListBox. Top + Random(200);
  ReadStream.Free;
end;


И имеем ошибку - CustomListBox не имеет ParentWindow. Про том что такая же конструкция с Кнопкой - работает отличнейшим образом. Гранды могут пояснить новичку - в чем проблема?
PM MAIL   Вверх
Snowy
Дата 20.8.2007, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Положи его на панельку и сохраняй и читай панельку.
Контейнер сам сохранит и прочитает детей.
И парента им назначит.
Просто текстсодержащие контролы не могут иметь текст, пока не получат окно, т.к. работа идёт через сообщения.
Текст назначается в процессе чтения, а паретн позже.
Поэтому нужно назначать парента в процессе чтения.
А это возможно только, если парент сохранён вместе с компонентом.
PM MAIL   Вверх
Samurai_I
Дата 20.8.2007, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

procedure TForm1.Button2Click(Sender: TObject);
begin
  MyFileStream := TFileStream.Create('kokojamba.tru',fmCreate,fmShareDenyNone);
  MyFileStream.WriteComponent(Panel1);
  MyFileStream.Free;
end;


procedure TForm1.Button3Click(Sender: TObject);
var
 ReadStream : TFileStream;
 CustomPanel  : TPanel;
begin
  Randomize;
  ReadStream := TFileStream.Create('kokojamba.tru',fmOpenRead,fmShareDenyNone);
  CustomPanel := ReadStream. ReadComponent(nil) as TPanel;
  CustomPanel.Parent := Form1;
  CustomPanel. Left := CustomPanel. Left + Random(200);
  Custompanel. Top := CustomPanel. Top + Random(200);
  ReadStream.Free;
end;




Что-то у меня бубен не так работает. Панель-то конечно копируется, но... без листбокса. Причем тасканьем по форме специально проверил, листбокс именно в панели как в контейнере лежит.
PM MAIL   Вверх
Rodman
Дата 21.8.2007, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


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

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



пытаюсь записать следующее
Код

    fs:=TFileStream.Create(MainForm.SaveDialog.FileName, fmCreate);
    try
        fs.Write(SHandle, sizeof(SHandle));//   StipjeHandle = 'SGP';
        fs.Write(SVersion, sizeof(SVersion));//SVersion = 1;                                                            <-Variable required
        fs.Write(CountSelected, sizeof(CountSelected));//кол-во записей в списке - целое          <-Variable required

вот в двух последних строках трабла, как ее вылечить?

Добавлено через 1 минуту и 13 секунд
даже приведение к строковому типу - теже траблы...
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Rennigth
Дата 21.8.2007, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



Rodman
SHandle, SVersion, CountSelected какой тип переменных?


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Rodman
Дата 21.8.2007, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


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

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



Цитата(Rennigth @  21.8.2007,  09:34 Найти цитируемый пост)
SHandle, SVersion, CountSelected какой тип переменных? 

см. коменты - это глобальные константы (SHandle - строка; SVersion - целое, но можно и строковое если надо)
CountSelected - целое
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Rennigth
Дата 21.8.2007, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



Rodman
Код

var
  fs: TFileStream;
  SHandle: string;
  SVersion: Integer;
  CountSelected: Integer;
begin
  SHandle := '123';
  SVersion := 123 ;
  CountSelected := 321;
  fs := TFileStream.Create('c:\test.dat', fmCreate or fmOpenWrite);
  try
    fs.WriteBuffer(SHandle[1], Length(SHandle));
    fs.WriteBuffer(SVersion, SizeOf(Integer));
    fs.WriteBuffer(CountSelected, SizeOf(Integer));
  finally
    fs.Free;
  end;


Это сообщение отредактировал(а) Rennigth - 21.8.2007, 10:11


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Rodman
Дата 21.8.2007, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


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

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



Rennigth, тот же эффект...

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  Exapmle.rar 2,98 Kb
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Rennigth
Дата 21.8.2007, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



чет файл не присоединяется...

Добавлено через 34 секунды
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

const SHandle: string = 'SGP';
      SVersion: Integer = 1;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    function CountSelected():Integer;
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  fs:TFileStream;
  lTmp: Integer;
begin
  fs:=TFileStream.Create('c:\1.txt', fmCreate);
  try
    fs.WriteBuffer(SHandle[1], Length(SHandle));
    fs.WriteBuffer(SVersion, SizeOf(Integer));
    lTmp := CountSelected;
    fs.WriteBuffer(lTmp, SizeOf(Integer));
  finally
    fs.free;
  end
end;

function TForm1.CountSelected():Integer;
begin
  Result:=15;
end;

procedure TForm1.Button2Click(Sender: TObject);
var fs:TFileStream;
    RHeandle:String;
    RData, i:Integer;
begin
  fs:=TFileStream.Create('c:\1.txt', fmOpenRead or fmShareDenyWrite);
  try
    SetLength(RHeandle, 3);
    fs.Read(RHeandle[1], 3);
    if(RHeandle=SHandle)then
    begin
      fs.Read(RData, SIZEOF(RData));
      if(RData>=1)then
      begin
        fs.Read(RData, SIZEOF(RData));
        ShowMessage('Ура');
      end
      else
    end
    else
      Showmessage('не Ура');
  finally
    fs.free;
  end;
end;

end.



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


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Samurai_I
Дата 22.8.2007, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Snowy
Цитата(Snowy @  20.8.2007,  15:18 Найти цитируемый пост)
Положи его на панельку и сохраняй и читай панельку.
Контейнер сам сохранит и прочитает детей.
И парента им назначит.
Просто текстсодержащие контролы не могут иметь текст, пока не получат окно, т.к. работа идёт через сообщения.
Текст назначается в процессе чтения, а паретн позже.
Поэтому нужно назначать парента в процессе чтения.
А это возможно только, если парент сохранён вместе с компонентом.

К сожалению если все эти процедуры с панелькой проделывать в design time, то возникает другая проблема. Panel, являесь parent'oм для всего содержимого самого себя, не является их хозяином. Хозяином остается форма - потому нужно либо эту панель создавать в runtime и кидать туда этот лист бокс(неуверен, что поможет), либо что-то придумывать с передачей владения Control'ом во время runtime. 
PM MAIL   Вверх
sentry
Дата 22.8.2007, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Code Monkey
*


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

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



Цитата(Samurai_I @  22.8.2007,  11:30 Найти цитируемый пост)
Panel, являесь parent'oм для всего содержимого самого себя, не является их хозяином. Хозяином остается форма - потому нужно либо эту панель создавать в runtime и кидать туда этот лист бокс(неуверен, что поможет), либо что-то придумывать с передачей владения Control'ом во время runtime.

Изменить владельца можно, вызвав у панели InsertComponent. А сериализуют компоненты действительно только то, чем владеют...

Это сообщение отредактировал(а) sentry - 22.8.2007, 16:42
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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