Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

Хранение параметров приложения   Найти похожие ветки 

 
GuAV ©   (2004-08-08 15:12) [0]

Интересная тут идея появилась.

Допустим нужно сохранить какую-то информацию в реестр/ини.

Публикуем эту информацию как свойства соотв формы:

 TDupeAction = (daAdd, daSkip, daReplace);
 TfrmMain = class(TForm)
   ...
 published
   property DupeAction: TDupeAction read FDupeAction write FDupeAction;
   property NamedUnits: Boolean read FNamedUnits write FNamedUnits;
   property Recourse: Boolean read GetRecourse write SetRecourse;
 end;

Теперь их можно сохранить, причем сам список получить как разницу свойств этой формы и TForm

procedure WriteProp(Ini: TCustomIniFile; Section: string;
 Obj: TObject; Info: PPropInfo);
begin
 with Info^ do
   case PropType^.Kind of
     tkInteger, tkEnumeration, tkChar:
       Ini.WriteInteger(Section, Name, GetOrdProp(Obj, Info));
     tkFloat:
       Ini.WriteFloat(Section, Name, GetFloatProp(Obj, Info));
     tkString, tkLString:
       Ini.WriteString(Section, Name, GetStrProp(Obj, Info));
     tkWString:
       Ini.WriteString(Section, Name, GetWideStrProp(Obj, Info));
   end;
end;

procedure ReadProp(Ini: TCustomIniFile; Section: string;
 Obj: TObject; Info: PPropInfo);
begin
 with Info^ do
 begin
   if not Ini.ValueExists(Section, Name) then Exit;
   case PropType^.Kind of
     tkInteger, tkEnumeration, tkChar:
       SetOrdProp(Obj, Info, Ini.ReadInteger(Section, Name, 0));
     tkFloat:
       SetFloatProp(Obj, Info, Ini.ReadFloat(Section, Name, 0));
     tkString, tkLString:
       SetStrProp(Obj, Info, Ini.ReadString(Section, Name, ""));
     tkWString:
       SetWideStrProp(Obj, Info, Ini.ReadString(Section, Name, ""));
   end;
 end;
end;

procedure ReadWriteNewPubProps(Ini: TCustomIniFile;
 Obj: TForm; Write: Boolean);
var
 J, Size1, Size2: Integer;
 List1, List2: PPropList;
begin
   Size1:=GetTypeData(TForm.ClassInfo).PropCount;
   Size2:=GetPropList(PTypeInfo(Obj.ClassInfo),List1) - Size1;
   GetMem(List2, SizeOf(PPropInfo)*Size2);
   Move((List1^[Size1]), List2^, SizeOf(PPropInfo)*Size2);
   FreeMem(List1, SizeOf(PPropInfo)*Size1);
   for J:=0 to Size2-1 do
     if Write then
       WriteProp(Ini, Obj.Name, Obj, List2[J])
     else
       ReadProp(Ini, Obj.Name, Obj, List2[J]);
   FreeMem(List2, SizeOf(PPropInfo)*Size2);end;

Так, например, если хотим использовать ini файл

procedure ReadWriteIni(Form: TForm; Write: Boolean);
var Ini: TIniFile;
begin
 Ini:=TIniFile.Create(
   ChangeFileExt(Application.ExeName,".ini"));
 try
    ReadWriteNewPubProps(Ini, Form, Write);
 finally
   Ini.Free;
 end;
end;

А в OnCreate/OnDestroy:

procedure TfrmMain.FormCreate(Sender: TObject);
 ...
begin
 ...
 ReadWriteIni(Self, False);
end;
procedure TfrmMain.FormDestroy(Sender: TObject);
begin
 ReadWriteIni(Self, True);
end;

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

Вот такой Ini получился:

[frmMain]
DupeAction=2
NamedUnits=0
Recourse=1


зы - возможны какие-то ошибки, но вроде работает.


 
GuAV ©   (2004-08-08 15:48) [1]

Да, забыл
uses IniFiles, TypInfo, Forms, Classes;


 
Sergey Kaminski ©   (2004-08-08 16:16) [2]

Я тоже подобное использовал. Даже где-то модуль завалялся от старого проекта на работе.


 
GuAV ©   (2004-08-08 16:34) [3]

Sergey Kaminski ©   (08.08.04 16:16) [2]
Скинь, плиз, чтоб я велосипед не изобретал...


 
Sergey Kaminski ©   (2004-08-08 16:54) [4]

Дак это сначала нужно на работу попасть :)
Отпуск закончится, пороюсь, если сохранилось - вышлю, обещаю. Только вряд ли это будет скоро.


 
Sergey Kaminski ©   (2004-08-08 16:59) [5]

К тому времени, "велосипед" превратится во вполне комфортабельный мотороллер Suzuki :)

Да, в общем, там очень похоже было. И кода строк на 300, не больше.
Только, если я правильно вспоминаю, все было сделано в виде процедуры, в которую передавалось два класса -- базовый и наследник, и сохранялись свойства наследника, отличные от базового. Т.е, работало с произвольными классами. А так все тож самое, кажись.


 
GuAV ©   (2004-08-08 17:29) [6]


> все было сделано в виде процедуры, в которую передавалось
> два класса -- базовый и наследник

сделать obj: TObject и добавить для наследник для универсальности, или сделать Obj.ClassParent - проблемы не вижу, но пока устраивает и так.

> К тому времени, "велосипед" превратится во вполне комфортабельный
> мотороллер Suzuki :)

Это точно. Можешь не искать. Лучше скажи где информация по TypInfo, кроме самого TypInfo.pas - F1 молчит...



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

Текущий архив: 2004.08.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.059 c
14-1091564102
Alex_Bredin
2004-08-04 00:15
2004.08.22
Рыбалка


1-1091729194
Hyperspeed
2004-08-05 22:06
2004.08.22
Как сделать поиск и данных и файле типа параметр:значение...


11-1079715719
nester
2004-03-19 20:01
2004.08.22
Как убрать заголовки страниц в TabControl?


1-1091781816
dizrov
2004-08-06 12:43
2004.08.22
Рекурсивный поиск


3-1091005053
Manfred
2004-07-28 12:57
2004.08.22
TClientDataSet.Locate ничего не находит