Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Excel VBA, CAD, Софт, ОС, Windows, Ubuntu, Android, VPS
Win Api, Assembler, C++, Java, Pascal, Lazarus, Delphi, OpenGL, DirectX
C#, Qt, .NET, ASP.NET, Windows Forms, ADO.NET, Framework, WPF, UWP, WinRT, XAML
HTML, CSS, JavaScript, Ajax, PHP, Perl, Python, Ruby, SQL, WordPress, API, XML, JSON, ActionScript, Flash

Ответ
 
Опции темы
Старый 29.10.2014, 09:26   #1
Teoret
 
Регистрация: 23.10.2014
Сообщений: 6
Репутация: 10
Радость При загрузке формы из файла *.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 Кб, 23 просмотров)

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

Цитата:
ReadComponentResFile
У-у-у старые грабли...
Я когда-то давно от них отказался насовсем. Уж лучше прописать тонну кода сохранявки в INI файл, чем такой костыль крепить к программе.
Это мнение из пичального опыта.
__________________
I'm learning to live...
Stilet вне форума   Ответить с цитированием
Старый 29.10.2014, 11:14   #3
min@y™
Цифровой кот
Профессионал
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Адрес: 1600, пенсильвания-авеню, п.г.т. верхний Вашингтонск, 8126 км от МКАД, от поста ГАИ - налево.
Сообщений: 6,681
Репутация: 1821

icq: 100500
skype: kick-ass
По умолчанию

TrxFormStorage/TjvFormStorage юзать должен ты, юный падаван! И будет щастье тебе неописуяемое.
__________________
Чтобы правильно заниматься всякой фигнёй на работе (и дома тоже),
нужно долго и кропотливо учиться!
min@y™ вне форума   Ответить с цитированием
Старый 29.10.2014, 11:24   #4
Toxa
Участник клуба
 
Аватар для Toxa
 
Регистрация: 01.12.2006
Адрес: Таганрог
Сообщений: 518
Репутация: 211

icq: 240909912
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
TrxFormStorage/TjvFormStorage юзать должен ты, юный падаван! И будет щастье тебе неописуяемое.
а чем это поможет? Teoret требуется загружать компоненты, а FormStorage только настройки подтягивает
__________________
Пишу на Delphi за еду
Toxa вне форума   Ответить с цитированием
Старый 29.10.2014, 11:28   #5
min@y™
Цифровой кот
Профессионал
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Адрес: 1600, пенсильвания-авеню, п.г.т. верхний Вашингтонск, 8126 км от МКАД, от поста ГАИ - налево.
Сообщений: 6,681
Репутация: 1821

icq: 100500
skype: kick-ass
По умолчанию

Цитата:
а чем это поможет?
Мож, мозгов прибавит. Мне всё равно.
__________________
Чтобы правильно заниматься всякой фигнёй на работе (и дома тоже),
нужно долго и кропотливо учиться!
min@y™ вне форума   Ответить с цитированием
Старый 29.10.2014, 11:29   #6
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк, Украина
Сообщений: 15,733
Репутация: 5728
По умолчанию

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

Цитата:
Сообщение от Аватар Посмотреть сообщение
А чего хорошего в загрузке компонент? Прям такая насущная необходимость. Скорее и загружает только потому, что не знает о существовании фотоаппаратов типа 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 в 13:49.
Teoret вне форума   Ответить с цитированием
Старый 29.10.2014, 14:03   #8
Stilet
Белик Виталий :)
Профессионал
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Адрес: Украина, Донецкая область, г. Краматорск
Сообщений: 57,968
Репутация: 6787
По умолчанию

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

Господа, по идее и сохранять нужно не саму форму, вынес кнопки за 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 Кб, 30 просмотров)
Teoret вне форума   Ответить с цитированием
Старый 29.10.2014, 14:10   #10
Teoret
 
Регистрация: 23.10.2014
Сообщений: 6
Репутация: 10
По умолчанию

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



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при загрузке массива из файла 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 09:52
Ошибка при загрузке файла html Ign Microsoft Office Excel 1 11.11.2007 14:55




21:44.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Покупайте на сайте www.skinon.ru уникальные чехлы и наклейки для телефонов.
купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru