Форум: "Компоненты";
Текущий архив: 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.5 MB
Время: 0.042 c