Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Вниз

Как соханять в файл StringGrid ?   Найти похожие ветки 

 
Axar   (2004-06-17 13:11) [0]

Приветствую всех ! У меня вопрос: есть ли какой красивый способ доработать компонент StringGrid, так чтобы можно было сохранять его состояние, а потом и загружать его из файла.. Желательно чтобы запоминались все настройки компонента, и содержимое в его "полях".. Заранее спасибо !


 
Igorek ©   (2004-06-17 19:08) [1]


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

Вообще то у каждого свои понятия о красоте. :-)

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

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


 
Axar   (2004-06-18 11:34) [2]

Хотелось бы добавить компонету методы по записи/чтению самого себя, что то типа:

var f: TFileStream;
begin
 f := TFileStream.Create(FileName, fmcreate);
 f.WriteComponent(StringGrid);
 f.Free;
end;
...
var
 f: TFileStream;
begin
 f := TFileStream.Create(FileName, fmOpenRead);
 f.ReadComponent(StringGrid);
 f.Free;

Но реализовать это внутри самого компонента не получается...

а пока проблему решил "тупо"... Просто пишу в текстовый файл...


 
Igorek ©   (2004-06-18 14:25) [3]


> Axar   (18.06.04 11:34) [2]
> Хотелось бы добавить компонету методы по записи/чтению самого
> себя, что то типа:

Давай для начала так:
1) ты даешь не "типа" код, а приводишь полный код своего компонента (там же не много - надеюсь ты не делаешь уж совсем тупо :-) )
2) код ты форматируешь (отступы, имена переменных функций и т.д.) согласно правилам, принятым в VCL
3) обязательно ставишь тэги при постинге на форум.
Ок?

Если да, то для начала и для примера я приведу часть своей заготовки:
 type
TSaveLoadStringGrid = class(TStringGrid)
 public
   function SaveToFile(const FileName: string): Boolean;
   function LoadFromFile(const FileName: string): Boolean;
 end;

implementation

function TSaveLoadStringGrid.SaveToFile(const FileName: string): Boolean;
var
 FileStream: TFileStream;
 Writer: TWriter;
begin
 Result := False;
 try
   FileStream := TFileStream.Create(FileName, fmCreate);
   Writer := TWriter.Create(FileStream, 4048);
   WriteState(Writer);
 finally
   FreeAndNil(Writer);
   FreeAndNil(FileStream);
 end;
 Result := True;
end;


К сожалению тупая Дельфа при компиляции последней процедуры дает хинт:
[Hint] Unit1.pas(79): Value assigned to "TSaveLoadStringGrid.SaveToFile" never used
Но мы тоже не дураки - еще раз просмотрев процедуру и не найдя в ней ничего крамольного посылаем компилятор к ... :-)


 
VMcL ©   (2004-06-18 15:34) [4]

>>Igorek ©  (18.06.04 14:25) [3]

1. У тебя в коде как минимум одна грубая ошибка (в try ... finally), которая запросто приведет к AV.

>К сожалению тупая Дельфа при компиляции последней процедуры дает хинт

2. Не хочу тебя оскорблять, поэтому просто замечу, что компилятор не тупой и хинт справедлив.


 
pasha_golub ©   (2004-06-20 22:12) [5]

Igorek ©   (18.06.04 14:25) [3]

У тебя всегда SaveToFile = True


 
GuAV ©   (2004-06-20 23:46) [6]


> У тебя всегда SaveToFile = True

Нет.

Например
> TFileStream.Create(FileName, fmCreate);
- ошибка (плохое имя файла, например).
пошли в finally - FreeAndNil там. допустим в стеке мусор. тогда вышли с результатом false и долгожданным AV, которое обещал VMcL © .


 
Axar   (2004-06-21 10:27) [7]

Всем:

Мастера! Прошу все же помочь с решением ! Основная проблема связана не с сохранением компонета в файл (это реализуется просто: FileStream.WriteComponent(StringGrid)), а с чтение компонента. Т. е. на форме есть компонент, и должна быть возможность пользователю загрузить состояние компонента из файла (по сути - удалить существующий, на его месте воссоздать из файла такойже, но с иными параметрами). И желательно чтобы код реализации принадлежал самому компоненту, а не форме. Последний вариант реализовать не сложно... Но вот как сделать чтобы сам компонент себя уничтожил а затем возродил себе подобного с тем же именем ? Или это нереализуемо ?...


 
Плохиш ©   (2004-06-21 10:41) [8]

>GuAV ©   (20.06.04 23:46) [6]
> Например
> > TFileStream.Create(FileName, fmCreate);
> - ошибка (плохое имя файла, например).
> пошли в finally - FreeAndNil там. допустим в стеке мусор.
> тогда вышли с результатом false и долгожданным AV, которое
> обещал VMcL © .

Можно вопрос: Куда вышли и кто будет обрабатьвать Result при возникновении исключения в этой функции?


 
Igorek ©   (2004-06-21 11:21) [9]


> VMcL ©   (18.06.04 15:34) [4]
> >>Igorek ©  (18.06.04 14:25) [3]
>
> 1. У тебя в коде как минимум одна грубая ошибка (в try ...
> finally), которая запросто приведет к AV.

Какая? У меня все работает. Вроде все нормально. Не мог бы ты подсказать где ошибка? И "как минимум" еще одна?


> >К сожалению тупая Дельфа при компиляции последней процедуры
> дает хинт
>
> 2. Не хочу тебя оскорблять, поэтому просто замечу, что компилятор
> не тупой и хинт справедлив.

Если я написал глупость - можешь так и сказать (выражения можешь не выбирать) - я не обижаюсь, когда мне говорят, что я неправ и аргументируют. :-)

Дело было так: я это написал, запостил, потом понял, что ошибся. Но спецом не постил повторно - хотел что-бы вопрошающий или повелся на "мы тоже не дураки" или "еще раз пересмотрел" сам и нашел справедливость хинта. Хотелось второго конечно - ведь любой может ошибиться - даже Мастер.

> Axar   (21.06.04 10:27) [7]
> а с чтение
> компонента. Т. е. на форме есть компонент, и должна быть
> возможность пользователю загрузить состояние компонента
> из файла (по сути - удалить существующий, на его месте воссоздать
> из файла такойже, но с иными параметрами). И желательно
> чтобы код реализации принадлежал самому компоненту, а не
> форме. Последний вариант реализовать не сложно... Но вот
> как сделать чтобы сам компонент себя уничтожил а затем возродил
> себе подобного с тем же именем ? Или это нереализуемо ?...

Имхо реализуемо. Напиши для начала, что ты уже сделал.


 
Axar   (2004-06-21 14:07) [10]

2 Igorek:

> Имхо реализуемо. Напиши для начала, что ты уже сделал.

Вот код:

unit Unit1;

interface

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

type
 //
 TForm1 = class(TForm)
   SaveButton: TButton;
   FreeButton: TButton;
   LoadButton: TButton;
   OpenDialog1: TOpenDialog;
   SaveDialog1: TSaveDialog;
   SelfSaveButton: TButton;
   SelfLoadButton: TButton;
   procedure FormCreate(Sender: TObject);
   procedure FreeButtonClick(Sender: TObject);
   procedure SaveButtonClick(Sender: TObject);
   procedure LoadButtonClick(Sender: TObject);
   procedure SelfSaveButtonClick(Sender: TObject);
   procedure SelfLoadButtonClick(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 //Новый класс
 TMyStrGrid=class(TStringGrid)
  private

  protected

  public
   procedure SaveToFile(FileName:string);
   procedure OpenFromFile(FileName:string);
 end;

var
 Form1: TForm1;
 MyStrGrid:TMyStrGrid;

implementation

{$R *.dfm}

//Сохранить компонент своим методом
procedure TMyStrGrid.SaveToFile(FileName:string);
Var FS:TFileStream;
begin
try
 FS:=TFileStream.Create(FileName,fmCreate);
 FS.WriteComponent(Self);
finally
 FS.Free;
end;
end;

//Загрузить компонент свои методом
procedure TMyStrGrid.OpenFromFile(FileName:string);
Var FS:TFileStream;
begin
try
 FS:=TFileStream.Create(FileName,fmOpenRead);
 FS.ReadComponent(Self);
finally
 FS.Free;
end;
end;

//Создание экземпляра при запуске приложения
procedure TForm1.FormCreate(Sender: TObject);
begin
MyStrGrid:=TMyStrGrid.Create(Self);
MyStrGrid.SetParent(Self);
MyStrGrid.Options:=MyStrGrid.Options+[goEditing];
end;

//Удаление экземляра при нажатии кнопки
procedure TForm1.FreeButtonClick(Sender: TObject);
begin
MyStrGrid.Free;
end;

//Сохранение компонента в файл
procedure TForm1.SaveButtonClick(Sender: TObject);
Var FS:TFileStream;
begin
if SaveDialog1.Execute then
 try
  FS:=TFileStream.Create(SaveDialog1.FileName,fmCreate); // or fmOpenWrite
  FS.WriteComponent(MyStrGrid);
 finally
  FS.Free;
 end;
end;

//Загрузить компонент из файла
procedure TForm1.LoadButtonClick(Sender: TObject);
Var FS:TFileStream;
begin
if OpenDialog1.Execute then
 try
  FS:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
  MyStrGrid:=TMyStrGrid.Create(Self);
  FS.ReadComponent(MyStrGrid);
  MyStrGrid.SetParent(Self);
 finally
  FS.Free;
 end;
end;

//Сохранеие компонета собственным методом
procedure TForm1.SelfSaveButtonClick(Sender: TObject);
begin
if SaveDialog1.Execute then
  MyStrGrid.SaveToFile(SaveDialog1.FileName);
end;

//Чтение компонента собственным методом
procedure TForm1.SelfLoadButtonClick(Sender: TObject);
begin
if OpenDialog1.Execute then
 MyStrGrid.OpenFromFile(OpenDialog1.FileName);
end;

end.

В данном случае все процедуры (внешние и внуренние компонента) выполняют действия одинаково... Все работоспособно, при условии что сохраненный элемент был пуст. При попытке загрузить элемент, имеющий заполненные текстовые поля, возникает ошибка "Class TInplaceEdit not found".. При загрузке компонента, отличающегося положением и размерами, все работает.


 
GuAV ©   (2004-06-23 00:32) [11]

<off>
Плохиш ©   (21.06.04 10:41) [8]

> Можно вопрос: Куда вышли и кто будет обрабатьвать Result
> при возникновении исключения в этой функции?

Ответ, надеюсь тоже можно.Да, результат таки не будет обработан в случае возникновения исключения. В любом случае он будет обрабатывать вызываючая подпрогамма, если он вообще будет обработан. Туда же, в подпрограмму, и вышли  :)
</off>


 
GrayFace ©   (2004-06-27 09:12) [12]

Не понял. Че значит "вышли"? Тут все однозначно: есть exception - нет результата, нет ошибки - Result=true


 
Sliski Slimak ©   (2004-06-27 23:03) [13]

TswStringGrid является наследником TStringGrid.
Добавлено несколько новых особенностей:
Событие OnHeadClick, подобное OnTitleClick у компонента TDBGrid.
Метод Sort, подобный такому же методу у TListView.
Несколько метод сортировки.
Событие OnCompare, подобное одноимённому у TListView.
Возможность записывать строки в текстовый файл и загружать строки в Grid из файла, созданного компонентом.

Новая версия компоненты
Компонента из раздела: Grids: String Grids



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

Форум: "Компоненты";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.038 c
6-1112079741
Гость
2005-03-29 11:02
2005.06.29
Реально ли отправить данные ...


4-1115567827
alex_samus
2005-05-08 19:57
2005.06.29
Параметры программы


3-1116515179
Karlson
2005-05-19 19:06
2005.06.29
Фильтр в компоненте TTable и ему подобным


1-1117721563
Erik1
2005-06-02 18:12
2005.06.29
Как записать указатель на процедуру в масв?


14-1117653659
Aldor
2005-06-01 23:20
2005.06.29
Фотографии со спутника





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский