Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2014, 08:26   #1
Teoret
 
Регистрация: 23.10.2014
Сообщений: 6
Радость При загрузке формы из файла *.dfm ошибка

Здравствуйте.

Софт:
Delphi7
с установленным AlphaSkin

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

Проблема:
При загрузке из файла ошибка:


Примечание:
Раньше выдавал ошибку: "Class TacProvider not found"
А в какой-то момент начал по другому себя вести.

Код:

Сохраняем форму:
Код:
procedure TForm2.sBitBtn3Click(Sender: TObject);
begin                          
WriteComponentResFile(ExtractFileDir(ParamStr(0))+'\Config\CFG.dfm', self)
end;
Так тоже сохраняет форму:

Код:

...
private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  F: TFileStream;

...

F := TFileStream.Create(ExtractFileDir(ParamStr(0))+'\Config\CFG.dfm', fmCreate);
F.WriteComponent(Self);
F.Free;
Загружаем из файла компоненты формы:
Код:
procedure TForm2.sBitBtn4Click(Sender: TObject);
var
x: integer;
begin
for x := ComponentCount-1 downto 0 do  //Удаляем компоненты с формы, всё работает
Components[x].Free;

                                             
ReadComponentResFile(ExtractFileDir(ParamStr(0))+'\Config\CFG.dfm', self)//Ругается на эту строку

end;
Когда загружаем так, тоже ошибка:
Код:
F := TFileStream.Create(ExtractFileDir(ParamStr(0))+'\Config\CFG.dfm', fmOpenRead);
F.ReadComponent(Self);
F.Free;

Компоненты на форме:
Код:
type
  TForm2 = class(TForm)
    sPageControl1: TsPageControl;
    sTabSheet1: TsTabSheet;
    SG0: TStringGrid;
    sBitBtn5: TsBitBtn;
    sBitBtn6: TsBitBtn;
    sEdit5: TsEdit;
    sGB0: TsGroupBox;
    Im30: TImage;
    Im10: TImage;
    Im20: TImage;
    sEdit10: TsEdit;
    sEdit20: TsEdit;
    sEdit30: TsEdit;
    sEdit40: TsEdit;
    sGroupBox2: TsGroupBox;
    sEdit6: TsEdit;
    sEdit7: TsEdit;
    sBitBtn1: TsBitBtn;
    sBitBtn2: TsBitBtn;
    sBitBtn3: TsBitBtn;
    sBitBtn4: TsBitBtn;
    sLabel1: TsLabel;
    sComboBox1: TsComboBox;
Изображения
Тип файла: jpg Новый точечный рисунок.jpg (20.2 Кб, 154 просмотров)

Последний раз редактировалось Teoret; 29.10.2014 в 08:30.
Teoret вне форума Ответить с цитированием
Старый 29.10.2014, 09:22   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
ReadComponentResFile
У-у-у старые грабли...
Я когда-то давно от них отказался насовсем. Уж лучше прописать тонну кода сохранявки в INI файл, чем такой костыль крепить к программе.
Это мнение из пичального опыта.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.10.2014, 10:14   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

TrxFormStorage/TjvFormStorage юзать должен ты, юный падаван! И будет щастье тебе неописуяемое.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 29.10.2014, 10:24   #4
Toxa
Форумчанин Подтвердите свой е-майл
 
Аватар для Toxa
 
Регистрация: 01.12.2006
Сообщений: 516
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
TrxFormStorage/TjvFormStorage юзать должен ты, юный падаван! И будет щастье тебе неописуяемое.
а чем это поможет? Teoret требуется загружать компоненты, а FormStorage только настройки подтягивает
Пишу на Delphi за еду
Toxa вне форума Ответить с цитированием
Старый 29.10.2014, 10:28   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
а чем это поможет?
Мож, мозгов прибавит. Мне всё равно.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 29.10.2014, 10:29   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Teoret требуется загружать компоненты
А чего хорошего в загрузке компонент? Прям такая насущная необходимость. Скорее и загружает только потому, что не знает о существовании фотоаппаратов типа FormStorage
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.10.2014, 12:45   #7
Teoret
 
Регистрация: 23.10.2014
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А чего хорошего в загрузке компонент? Прям такая насущная необходимость. Скорее и загружает только потому, что не знает о существовании фотоаппаратов типа FormStorage
Спасибо. Подскажите пожалуйста, не доводилось вам проверять на корректность работу TFormStorage с AlphaSkin?

Цитата:
Сообщение от min@y™ Посмотреть сообщение
TrxFormStorage/TjvFormStorage юзать должен ты, юный падаван! И будет щастье тебе неописуяемое.
Спасибо, но может возникнуть ситуация что некоторые компоненты будут удалены/созданы(динамически), а другие изменены (значения в ячейках StrinGrid'ов и Edit'ов), следовательно потребуется по нажатию кнопки "Отмена" вернуть исходное состояние формы, принадлежащих ей компонентов, с сохранёнными ранее параметрами.



Цитата:
Сообщение от Stilet Посмотреть сообщение
У-у-у старые грабли...
Я когда-то давно от них отказался насовсем. Уж лучше прописать тонну кода сохранявки в INI файл, чем такой костыль крепить к программе.
Это мнение из пичального опыта.
Спасибо.

Можете ещё ответить, по этим функциям? Целесообразно их использовать для сохранения всех компонентов формы, или лучше руками прописать экспорт и импорт параметров и значений динамических и статических компонентов в файл?
Задача при сохранении оптимизация работы программы, наиболее надёжный вариант. Что посоветуете?
До этого писал сохранения только вручную, в отдельные файлы, в этот раз хотел сэкономить время.

Источник
Код:
unit ZFunctions;
interface
uses
   ... IniFiles, variants, ...
...
const
 IniDefSection = 'Options';
...
function SaveParamsIni(
     IniFile,Section,KeyName : string; 
     Value : variant) : Boolean;
function RestoreParamsIni(
     IniFile,Section,KeyName : string; 
     DefaultValue : variant):variant;
...
implementation
...
function SaveParamsIni(
      IniFile,Section,KeyName : string; 
      Value : variant) : Boolean;
var
  fINI: TIniFile;
begin
  if Section = '' then Section := IniDefSection;
  Result := false;
  fINI := Tinifile.Create(extractfilepath(Application.ExeName) + IniFile);
  try
   fINI.WriteString(Section, KeyName, Value);
   Result := True;
  finally
   FreeAndNil(fINI);
  end;
end;
 
function RestoreParamsIni(
      IniFile,Section,KeyName : string; 
      DefaultValue : variant):variant;
var
  fINI: TIniFile;
begin
  if Section = '' then Section := IniDefSection;
  Result := DefaultValue;
  fINI := Tinifile.Create(extractfilepath(Application.ExeName) + IniFile);
  try
   Result := fINI.ReadString(Section, KeyName, DefaultValue);
  finally
   FreeAndNil(fINI);
  end;
end;
...
P.S. Был на "выезде", сразу не ответил.

Последний раз редактировалось Teoret; 29.10.2014 в 12:49.
Teoret вне форума Ответить с цитированием
Старый 29.10.2014, 13:03   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Можете ещё ответить, по этим функциям? Целесообразно их использовать для сохранения всех компонентов формы, или лучше руками прописать экспорт и импорт параметров и значений динамических и статических компонентов в файл?
Эти "функции" годятся только как пример, ибо каждый раз переоткрывать ИНИ файл глупо.
Как иллюстрация - да. Как маршевое ПО - нет.
Открыл ИНИ - пиши в него все скопом, потом закрываешь, а тут каждый вызов функции открывает и закрывает. Можно, но глупо.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.10.2014, 13:08   #9
Teoret
 
Регистрация: 23.10.2014
Сообщений: 6
По умолчанию

Господа, по идее и сохранять нужно не саму форму, вынес кнопки за sPageControl1
Теперь требуется лишь sPageControl1 экспортировать в файл с компонентами на нём, а на нём у меня:



Но TabSheet может быть множество, однако тут нет проблем, так как у всех компонентов буду фиксированные имена, привязанные к индексу sTabSheets на котором они расположены :
Код:
procedure TForm2.sBitBtn5Click(Sender: TObject);
var
   n:TsTabSheet;
   k:TStringGrid;
   e:TsEdit;
   im:TImage;
   gb:TsGroupBox;
   i:integer;
   m:TMenuItem;

begin


   for i:=0 to sPageControl1.PageCount-1 do       //Проверка на дублирование
      if sEdit5.Text=sPageControl1.Pages[i].Caption then
         begin
            showmessage('Совпадение имён.');
            exit;
         end;

            n:=TsTabSheet.Create(sPageControl1); //Создаём ТабЩит
            n.Caption:=sEdit5.Text;
            n.PageControl:=sPageControl1;
            sPageControl1.ActivePageIndex:=i;    //Делаем созданную ТабЩит активной

            m:= TMenuItem.Create(nil);
            //Создаём элемент в PopurMenu
            m.Caption:=sPageControl1.ActivePage.Caption;
            m.OnClick:=OnMyMenuItemClick;
            form1.PopupMenu1.Items.Items[1].Add(m);

            k:=TStringGrid.Create(sPageControl1.ActivePage);   //Создаём СтрингГрид
            k.Parent:=sPageControl1.ActivePage;
            k.Left:=0;
            k.Top:=0;
            k.Height:=289;
            k.Width:=715;
            k.FixedCols:=0;
            k.FixedRows:=1;
            k.DefaultColWidth:=50;
            k.ColWidths[0]:=80;
            k.ColWidths[1]:=120;
            k.ColWidths[2]:=90;
            k.ColWidths[3]:=400;
            k.Options:=[goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine,goRangeSelect,goEditing];
            k.OnSelectCell:=SG0.OnSelectCell;
            k.Cells[0,0]:='1';
            k.Cells[1,0]:='2';
            k.Cells[2,0]:='3';
            k.Cells[3,0]:='4';
                        
            k.ColCount:=4;
            k.RowCount:=2;
            k.Name:='SG'+inttostr(i);

            //Ñîçäà¸ì sGroupBox
            gb:=TsGroupBox.Create(sPageControl1.ActivePage);   //Создаём ГрупБокс
            gb.Parent:=sPageControl1.ActivePage;
            gb.Left:=2;
            gb.Top:=168;
            gb.caption:='Текст в групБоксе';
            gb.Height:=117;
            gb.Width:=145;
            gb.CaptionLayout:=clTopCenter;
            gb.Name:='sGB'+inttostr(i);

            //Создаём Эдит1
            e:=TSEdit.Create(TsGroupBox(sPageControl1.ActivePage.FindComponent('sGB'+inttostr(i))));  
            e.Parent:=TsGroupBox(sPageControl1.ActivePage.FindComponent('sGB'+inttostr(i)));
            e.Left:=8;
            e.Top:=48;
            e.Height:=21;
            e.Width:=25;
            e.Text:='0';
            e.Name:='sEdit1'+inttostr(i);

            //Создаём Эдит2
            e:=TSEdit.Create(TsGroupBox(sPageControl1.ActivePage.FindComponent('sGB'+inttostr(i))));  
            e.Parent:=TsGroupBox(sPageControl1.ActivePage.FindComponent('sGB'+inttostr(i)));
            e.Left:=96;
            e.Top:=48;
            e.Height:=21;
            e.Width:=25;
            e.Text:='100';
            e.Name:='sEdit2'+inttostr(i);

            //Создаём Эдит3
            e:=TSEdit.Create(TsGroupBox(sPageControl1.ActivePage.FindComponent('sGB'+inttostr(i))));   
            e.Parent:=TsGroupBox(sPageControl1.ActivePage.FindComponent('sGB'+inttostr(i)));
            e.Left:=48;
            e.Top:=16;
            e.Height:=21;
            e.Width:=25;
            e.Text:='0';
            e.Name:='sEdit3'+inttostr(i);

            //Создаём Эдит4
            e:=TSEdit.Create(TsGroupBox(sPageControl1.ActivePage.FindComponent('sGB'+inttostr(i))));   
            e.Parent:=TsGroupBox(sPageControl1.ActivePage.FindComponent('sGB'+inttostr(i)));
            e.Left:=48;
            e.Top:=88;
            e.Height:=21;
            e.Width:=25;
            e.Text:='100';
            e.Name:='sEdit4'+inttostr(i);

             //Создаём Image3
            im:=TImage.Create(TsGroupBox(sPageControl1.ActivePage.FindComponent('sGB'+inttostr(i))));   
            im.Parent:=TsGroupBox(sPageControl1.ActivePage.FindComponent('sGB'+inttostr(i)));
            im.Left:=8;
            im.Top:=16;
            im.Height:=97;
            im.Width:=129;
            im.Picture:=im30.Picture;
            im.Name:='Im3'+inttostr(i);

        

end;
Изображения
Тип файла: png Безымянный.png (4.1 Кб, 99 просмотров)
Teoret вне форума Ответить с цитированием
Старый 29.10.2014, 13:10   #10
Teoret
 
Регистрация: 23.10.2014
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Эти "функции" годятся только как пример, ибо каждый раз переоткрывать ИНИ файл глупо.
Как иллюстрация - да. Как маршевое ПО - нет.
Открыл ИНИ - пиши в него все скопом, потом закрываешь, а тут каждый вызов функции открывает и закрывает. Можно, но глупо.
Спасибо, сделаю всё через перебор.
Teoret вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при загрузке массива из файла Damik Общие вопросы Delphi 1 14.02.2013 10:46
Ошибка при загрузке формы CBETJIbIu Microsoft Office Access 2 03.02.2012 23:01
Ошибка при загрузке XML файла Alter Общие вопросы Delphi 4 25.09.2011 13:58
Ошибка при загрузке файла через броузер _PROGRAMM_ PHP 6 24.01.2011 08:52
Ошибка при загрузке файла html Ign Microsoft Office Excel 1 11.11.2007 13:55