Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Способ автосохранения Editов, CheckBoxов, Memo и т.д. / 25 сообщений из 30, страница 1 из 2
15.08.2019, 19:41
    #39850013
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
Вот может кому пригодится

Вызов:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
procedure TYourForm.FormCreate(Sender: TObject);
begin
  FormLoad(Self);
...

procedure TYourForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := FormSave (self);
...

program YourProgramm;
uses
....
begin
//  ReportMemoryLeaksOnShutdown := True;
  Application.UpdateFormatSettings:=False;
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.Title := 'Enforce it!';
  Start;
....

procedure Start; // 
var
  buffer     : array[0..255] of char;
  buffsize   : DWORD;
begin
  buffsize := sizeOf(buffer);
  GetComputerName(buffer, buffsize);
  MyMachine := buffer;

  buffsize := sizeOf(buffer);
  GetUserName(@buffer, buffSize);
  if MyUSerCode = '' then MyUserCode := UpperCase(buffer);
end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
procedure FormLoad(Form: TForm);
var
  INIFile : TIniFile;
  FormOnResize : Tevent;
begin
  Form.Caption := Application.Title + '   ' + MyUserCode;
  CM_INI := lowercase(ExtractFilePath(Application.ExeName) +'\ini');
  FormOnResize := nil;
  if CM_INI <> '' then begin
    if MyUserCode <> '' then begin
      INIFile := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'ini\' + lowercase(MyUserCode) + '.ini');
      try
        if Assigned (Form.OnResize) then begin
          FormOnResize := Form.OnResize;
          Form.OnResize := nil;
        end;
        ReadVals (Form, Form.Caption, INIFile);
      finally
        if Assigned (FormOnResize) then
          Form.OnResize := FormOnResize;
        INIFile.Free;
      end;
    end;
  end;
end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
function FormSave(Form: TForm; ConfirmExit: Boolean = false): boolean;
var
  iniUser        : TIniFile;
begin
  Result := True;
  if ConfirmExit = True then
      if MessageDlg('Выходим??',mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes then
        Result := True
      else
        Result := False
    else
      Result := True;
// save the screens position in the users .ini file

  if result then begin
    try
      if MyUserCode <> '' then begin
        if not SysUtils.DirectoryExists(ExtractFilePath(Application.ExeName) + 'ini') then
          SysUtils.ForceDirectories (ExtractFilePath(Application.ExeName) + 'ini');
        iniUser := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'ini\' + lowercase(MyUserCode) + '.ini');
        try
          if Form.Caption <> '' then begin
            WriteVals (Form, Form.Caption, iniUser);
          end;
        finally
          iniUser.Free;
        end;
      end;
    except
      ErrorLog('Error saving user settings' + ' ' + MyUserCode);
    end;
  end;
end;

...
Рейтинг: 0 / 0
15.08.2019, 19:43
    #39850015
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
Собственно, самый цимес:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
procedure ReadVals (Parent: TWinControl; Capt : string; ini : TIniFile);
var i : Integer; s : string;
begin
  for i := 0 to Parent.ControlCount - 1 do begin
    if Parent.Controls [i].tag = 22 then begin
        if Parent.Controls [i] is TEdit then
          (Parent.Controls [i] as TEdit).Text := ini.ReadString(Capt, Parent.Controls [i].name, (Parent.Controls [i] as TEdit).Text);
        if Parent.Controls [i] is TLabeledEdit then
          (Parent.Controls [i] as TLabeledEdit).Text := ini.ReadString(Capt, Parent.Controls [i].name, (Parent.Controls [i] as TLabeledEdit).Text);
//        if Parent.Controls [i] is TDBEdit then
//          (Parent.Controls [i] as TDBEdit).Text := ini.ReadString(Capt, Parent.Controls [i].name, (Parent.Controls [i] as TDBEdit).text);
{$ifdef INFOPOWER}
        if Parent.Controls [i] is TwwDBEdit then
          (Parent.Controls [i] as TwwDBEdit).Text := ini.ReadString(Capt, Parent.Controls [i].name, (Parent.Controls [i] as TwwDBEdit).text);
        if Parent.Controls [i] is TwwDBDateTimePicker then
          (Parent.Controls [i] as TwwDBDateTimePicker).Date := StrToDate (ini.ReadString(Capt, Parent.Controls [i].name, emptystr));
{$endif}
        if Parent.Controls [i] is TDateTimePicker then
          (Parent.Controls [i] as TDateTimePicker).Date := StrToDate (ini.ReadString(Capt, Parent.Controls [i].name, emptystr));
        if Parent.Controls [i] is TDriveComboBox then begin
          s := ini.ReadString(Capt, Parent.Controls [i].name, emptystr);
          if trim(s) <> emptystr then
            TDriveComboBox(Parent.Controls [i]).Drive := s[1];
        end;
        if Parent.Controls [i] is TDirectoryListBox then begin
          s := ini.ReadString(Capt, Parent.Controls [i].name, emptystr);
          if trim(s) <> emptystr then
            TDirectoryListBox(Parent.Controls [i]).Directory := s;
        end;
        if Parent.Controls [i] is TFileListBox then begin
          s := ini.ReadString(Capt, Parent.Controls [i].name, emptystr);
          if trim(s) <> emptystr then
            TFileListBox(Parent.Controls [i]).FileName := s;
        end;
{$ifdef JV}
        if Parent.Controls [i] is TJvDriveCombo then begin
          s := ini.ReadString(Capt, Parent.Controls [i].name, emptystr);
          if trim(s) <> emptystr then
            (Parent.Controls [i] as TJvDriveCombo).Drive := s[1];
        end;
        if Parent.Controls [i] is TJvDirectoryListBox then begin
          s := ini.ReadString(Capt, Parent.Controls [i].name, emptystr);
          if trim(s) <> emptystr then
            (Parent.Controls [i] as TJvDirectoryListBox).Directory := s;
        end;
        if Parent.Controls [i] is TJvFileListBox then begin
          s := ini.ReadString(Capt, Parent.Controls [i].name, emptystr);
          if trim(s) <> emptystr then
            (Parent.Controls [i] as TJvFileListBox).FileName := s;
        end;
{$endif}
        if Parent.Controls [i] is TMemo then begin
          s := ini.ReadString(Capt, Parent.Controls [i].name, emptystr);
          if trim(s) <> emptystr then TMemo(Parent.Controls[i]).Lines.Clear;
          while trim(s) <> emptystr do begin
            TMemo(Parent.Controls[i]).Lines.Add(s);
            ini.DeleteKey(Capt, Parent.Controls [i].name);
            s := ini.ReadString(Capt, Parent.Controls [i].name, emptystr);
          end;
        end;
        if Parent.Controls [i] is TCheckBox then begin
          s := ini.ReadString(Capt, Parent.Controls [i].name, emptystr);
          if trim (s) = '1' then (Parent.Controls [i] as TCheckBox).Checked := true else
             (Parent.Controls [i] as TCheckBox).Checked := false;
        end;
    end;
    if Parent.Controls [i] is TWinControl then
      ReadVals (TWinControl(Parent.Controls [i]),Capt, ini);
  end;
end;

procedure WriteVals (Parent: TWinControl; Capt : string; ini : TIniFile);
var i,j : Integer; F : TextFile;
begin
  for i := 0 to Parent.ControlCount - 1 do begin
    if Parent.Controls [i].tag = 22 then begin
        if Parent.Controls [i] is TEdit then
          ini.WriteString(Capt, Parent.Controls [i].name,            TEdit(Parent.Controls [i]).text);
        if Parent.Controls [i] is TLabeledEdit then
          ini.WriteString(Capt, Parent.Controls [i].name,            TLabeledEdit(Parent.Controls [i]).text);
//        if Parent.Controls [i] is TDBEdit then
//          ini.WriteString(Capt, Parent.Controls [i].name,            (Parent.Controls [i] as TDBEdit).text);
{$ifdef INFOPOWER}
        if Parent.Controls [i] is TwwDBEdit then
          ini.WriteString(Capt, Parent.Controls [i].name,            (Parent.Controls [i] as TwwDBEdit).text);
        if Parent.Controls [i] is TwwDBDateTimePicker then
          ini.WriteString(Capt, Parent.Controls [i].name, DateToStr ((Parent.Controls [i] as TwwDBDateTimePicker).Date));
{$endif}
        if Parent.Controls [i] is TDateTimePicker then
          ini.WriteString(Capt, Parent.Controls [i].name, DateToStr ((Parent.Controls [i] as TDateTimePicker).Date));
        if Parent.Controls [i] is TDriveComboBox then
          ini.WriteString(Capt, Parent.Controls [i].name, TDriveComboBox(Parent.Controls [i]).Drive);
        if Parent.Controls [i] is TDirectoryListBox then
          ini.WriteString(Capt, Parent.Controls [i].name, TDirectoryListBox(Parent.Controls [i]).Directory);
        if Parent.Controls [i] is TFileListBox then
          ini.WriteString(Capt, Parent.Controls [i].name, TFileListBox(Parent.Controls [i]).FileName);
{$ifdef JV}
        if Parent.Controls [i] is TJvDriveCombo then
          ini.WriteString(Capt, Parent.Controls [i].name, (Parent.Controls [i] as TJvDriveCombo).Drive);
        if Parent.Controls [i] is TJvDirectoryListBox then
          ini.WriteString(Capt, Parent.Controls [i].name, (Parent.Controls [i] as TJvDirectoryListBox).Directory);
        if Parent.Controls [i] is TJvFileListBox then
          ini.WriteString(Capt, Parent.Controls [i].name, (Parent.Controls [i] as TJvFileListBox).FileName);
{$endif}
        if Parent.Controls [i] is TMemo then begin
            AssignFile(F, ini.FileName);
            Append(F);
          for j := 0 to TMemo(Parent.Controls[i]).Lines.Count - 1 do begin
              if trim (TMemo(Parent.Controls[i]).Lines[j]) <> emptystr then
                Writeln(F, Parent.Controls [i].name + '=' + TMemo(Parent.Controls[i]).Lines[j]);
          end;
            Flush(F);
            CloseFile(F);
          end;
        if Parent.Controls [i] is TCheckBox then begin
          if TCheckBox(Parent.Controls [i]).Checked then
             ini.WriteString(Capt, Parent.Controls [i].name, '1') else ini.WriteString(Capt, Parent.Controls [i].name, '0')
        end;
    end;
    if Parent.Controls [i] is TWinControl then
      WriteVals (TWinControl(Parent.Controls [i]), Capt, ini);
  end;
end;


Теперь ставим на контролы, которые хотим сохранять тэг=22 и voila
...
Рейтинг: 0 / 0
15.08.2019, 19:44
    #39850017
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
что этот код делает?
...
Рейтинг: 0 / 0
15.08.2019, 19:56
    #39850021
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
makhaon,

Сохраняет значения контролов при выходе из программы в ini файле и загружает их при создании формы. Нужно только в тэге поставить 22.
...
Рейтинг: 0 / 0
15.08.2019, 20:07
    #39850024
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
Victor Cookin,

Стоило ли городить велосипед, когда готовых много? Я, например, юзаю TJvFormStorage. Умеет сохранять любые опубликованные свойства компонент формы, кода не нужно вообще. Сохраняет в Ini, xml, базу, реестр.
...
Рейтинг: 0 / 0
15.08.2019, 20:08
    #39850025
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
ну и так, куча плюшек - сохранение самой формы, и любых параметров.
и это не единственные компоненты такие.
...
Рейтинг: 0 / 0
15.08.2019, 20:14
    #39850027
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
makhaon, а TJvFormStorage, умеет сохранять только те, которые попросили или скопом все?
...
Рейтинг: 0 / 0
15.08.2019, 20:40
    #39850035
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
Victor Cookin, а нагуглить https://wiki.delphi-jedi.org/wiki/JVCL_Help:TJvFormStorage религия запрещает?
___
Это я так... Ворчу
...
Рейтинг: 0 / 0
15.08.2019, 20:47
    #39850037
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
Victor Cookin,

что добавишь в список сохранения, то сохранит и восстановит.
...
Рейтинг: 0 / 0
15.08.2019, 20:51
    #39850040
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
Gator, makhaon - спасибо. Человек - животное общественное. Спросить приятнее чем гуглить.
...
Рейтинг: 0 / 0
15.08.2019, 21:18
    #39850044
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
самое интересное, что жедаи уже стоят :) демки хотя бы посмотри, там много всякого. эта компонента, что я кинул в том числе.
...
Рейтинг: 0 / 0
15.08.2019, 21:43
    #39850049
krapotkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
а вообще концептуально это крайне странно
формы должны служить для взаимодействия с моделью данных
и сохранение/загрузка данных уж точно не их формячье дело
...
Рейтинг: 0 / 0
15.08.2019, 21:54
    #39850052
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
Dimitry Sibiryakov,

Ну мало ли, не у всех жедаи стоят, а ставить жедаи только из-за такой фичи не каждый захочет.
...
Рейтинг: 0 / 0
15.08.2019, 21:56
    #39850053
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
makhaon,

а как вычислил что у меня жедаи стоят?
...
Рейтинг: 0 / 0
15.08.2019, 22:19
    #39850069
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
Victor Cookinmakhaon,

а как вычислил что у меня жедаи стоят?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
{$ifdef JV}
        if Parent.Controls [i] is TJvDriveCombo then
          ini.WriteString(Capt, Parent.Controls [i].name, (Parent.Controls [i] as TJvDriveCombo).Drive);
        if Parent.Controls [i] is TJvDirectoryListBox then
          ini.WriteString(Capt, Parent.Controls [i].name, (Parent.Controls [i] as TJvDirectoryListBox).Directory);
        if Parent.Controls [i] is TJvFileListBox then
          ini.WriteString(Capt, Parent.Controls [i].name, (Parent.Controls [i] as TJvFileListBox).FileName);
{$endif}
...
Рейтинг: 0 / 0
15.08.2019, 22:36
    #39850071
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
DimaBr,

Да, сейчас стоят, но если бы ВСЕГДА стояли, то никаких
Код: pascal
1.
{$ifdef JV}

не было бы
...
Рейтинг: 0 / 0
15.08.2019, 22:53
    #39850072
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
Откройте секрет, какой смысл несут эти строки ?
Код: pascal
1.
2.
        if Parent.Controls [i] is TwwDBEdit then
          (Parent.Controls [i] as TwwDBEdit).Text := ini.ReadString(Capt, Parent.Controls [i].name, (Parent.Controls [i] as TwwDBEdit).text);
...
Рейтинг: 0 / 0
15.08.2019, 22:57
    #39850074
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
Почему не написать так ?
Код: pascal
1.
2.
3.
4.
5.
for i := 0 to Parent.ControlCount - 1 do begin
  C := Parent.Controls[i];
  if C.Tag = 22 then begin
   if C is TEdit        then TEdit(C).Text := ini.ReadString(Capt, C.Name, TEdit(C).Text);
   if C is TLabeledEdit then TLabeledEdit(C).Text := ini.ReadString(Capt, C.Name, TLabeledEdit(C).Text);
...
Рейтинг: 0 / 0
15.08.2019, 23:04
    #39850078
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
DimaBr,

у тебя используется лишнее присвоение, чем твой код лучше?
...
Рейтинг: 0 / 0
15.08.2019, 23:20
    #39850080
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
а почему бы не проверять но InheritsFrom(TWincontrol)?
...
Рейтинг: 0 / 0
15.08.2019, 23:34
    #39850084
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
Gator,

О! Идея.
...
Рейтинг: 0 / 0
16.08.2019, 00:26
    #39850089
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
Victor Cookin,

в EhLib есть компонентик TPropStorageEh. Он визуально показывает доступные компоненты и свойства, а ты можешь указать, что именно сохранять.
Например, хочу сохранять размеры и позицию окна, а также текст в Edit1:
...
Рейтинг: 0 / 0
16.08.2019, 01:36
    #39850094
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
Victor CookinDimaBr,
у тебя используется лишнее присвоение, чем твой код лучше?

Да, у меня одно присвоение. А у вас 4 раза вызывается функция !!!

Код: pascal
1.
2.
if Parent.Controls [i] is TEdit then
          (Parent.Controls [i] as TEdit).Text := ini.ReadString(Capt, Parent.Controls [i].name, (Parent.Controls [i] as TEdit).Text);




Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
property Controls[Index: Integer]: TControl read GetControl;

function TWinControl.GetControl(Index: Integer): TControl;
var
  N: Integer;
begin
  if FControls <> nil then N := FControls.Count else N := 0;
  if Index < N then
    Result := FControls[Index] else
    Result := FWinControls[Index - N];
end;
...
Рейтинг: 0 / 0
16.08.2019, 09:37
    #39850162
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
ёёёёёв EhLib есть компонентик TPropStorageEh.
эдак , и я смогу. Причем, все в комплекте искаропки идет
...
Рейтинг: 0 / 0
16.08.2019, 10:24
    #39850189
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Способ автосохранения Editов, CheckBoxов, Memo и т.д.
К слову, если уж делать своё, то лучше не писать портянки с частными компонентами, а юзать RTTI. Ключевики: GetPropInfo, GetPropValue, SetPropValue, дальше - Гугл в помощь.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Способ автосохранения Editов, CheckBoxов, Memo и т.д. / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]