Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 744

/ вопрос решён /

Здравствуйте!
Работа с компонентом ComboBox:
Что нужно сделать, чтобы новое вводимое значение сохранялось с Items?
Пробовала так:
"new:=ComboBox1.Text;
Combobox1.Items.Add(new)"
В результате новое значение сохраняется, но только до тех пор, пока приложение не будет перезапущено. А надо, чтоб сохранялись навсегда.

Emma Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задала: Emma (статус: Посетитель)
Вопрос отправлен: 2 июля 2008, 23:32
Состояние вопроса: решён, ответов: 3.

Ответ #1. Отвечает эксперт: ANBsoft

Здравствуйте, Emma!
При выходе из приложения выполнить что-то вроде ComboBox1.Items.SaveToFile('FileName'),
а при входе ComboBox1.Items.LoadFromFile('FileName') соответственно.
Это самый просто вариант, можно еще сохранить в ini файле.

Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 2 июля 2008, 23:54
Оценка за ответ: 5

Комментарий к оценке: Спасибо!

Ответ #2. Отвечает эксперт: min@y™

Возможно, тебе подсобит моя функция, которая добавляет введённый в комбобокс текст в верхнюю строку списка, если в списке эта строка ранее отсутствовала, в противном случае она эту строку перемещает наверх. Если после добавления строки количество строк списка превысит заданное значение (в данном случае 16), то последняя строка удаляется, как наиболее старая.

procedure PushComboBoxItems(Items: TStrings; const NewItem: string);
var
  Index, Count: Integer;
begin
  if not Assigned(Items)
    then Exit;
 
  if NewItem = ''
    then Exit;
 
  Index:= Items.IndexOf(NewItem);
 
  if Index < 0
    then Items.Insert(0, NewItem)
    else Items.Move(Index, 0);
 
  Count:= Items.Count;
 
  while Count > 16 do
    begin
      Items.Delete(Count-1);
      Dec(Count);
    end;
end;

А сохранять/загружать строки списка можно также в реестр/из реестра:

uses
  Registry, SysUtils, Classes, Windows { ,...может быть ещё что-то } ;
 
const
  MyProgramKey = 'Software\MyProgram';
 
// Сохранение списка строк в реестре
procedure SaveStrings2Registry(const SubKey: string; Items: TStrings);
var
  Reg: TRegistry;
  Index: Integer;
begin
  Reg:= TRegistry.Create();
 
  try
    Reg.RootKey:= HKEY_CURRENT_USER;
    Reg.OpenKey(MyProgramKey + '\' + SubKey, True);
 
    Reg.WriteInteger('Items_Count', Items.Count);
    for Index:= 0 to Items.Count - 1 do
      Reg.WriteString('Item' + IntToStr(Index), Items[Index]);
 
    Reg.CloseKey();
  finally
    Reg.Free();
  end;
end;
 
// Загрузка списка строк из реестра
procedure LoadRegistry2Strings(const SubKey: string; Items: TStrings);
var
  Reg: TRegistry;
  Index, Count: Integer;
begin
  Reg:= TRegistry.Create();
  Items.Clear();
 
  try
    Reg.RootKey:= HKEY_CURRENT_USER;
    if Reg.OpenKey(MyProgramKey + '\' + SubKey, False)
      then begin
             if Reg.ValueExists('Items_Count')
               then Count:= Reg.ReadInteger('Items_Count')
               else Count:= 0;
 
             for Index:= 0 to Count - 1 do
               if Reg.ValueExists('Item' + IntToStr(Index))
                 then Items.Add(Reg.ReadString('Item' + IntToStr(Index)));
 
             Reg.CloseKey();
           end;
  finally
    Reg.Free();
  end;
end;
 
// Вызов функций:
SaveStrings2Registry('ComboBox1', ComboBox1.Items);
LoadRegistry2Strings('ComboBox1', ComboBox1.Items);

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 3 июля 2008, 08:42
Оценка за ответ: 4

Комментарий к оценке: Спасибо, но уж слишком запутано ... В моем случае можно обойтись более простым способом.

Ответ #3. Отвечает эксперт: rnt777

Здравствуйте, Emma!
можно сохранять в INI-файле.
привожу код с описанием

Приложение:
  1. Uses IniFiles;
  2. ...
  3. var Ini: TIniFile;
  4. ...
  5.  
  6. procedure TForm1.FormCreate(Sender: TObject);
  7. var count, i: smallint;
  8. begin
  9.  
  10. Ini:=TIniFile.Create(extractfilepath(paramstr(0))+'config.ini');
  11.  
  12. if Ini.SectionExists('Combo')
  13. then begin
  14. count:=ini.ReadInteger('Combo','count',-1);
  15.  
  16. if count>0
  17. then begin
  18.  
  19.  
  20. for i:=1 to Count do
  21. Form1.ComboBox1.Items.Add(ini.ReadString('Combo','item'+inttostr(i),''))
  22.  
  23. end;
  24. end;
  25. end;
  26.  
  27.  
  28. procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
  29. begin
  30.  
  31.  
  32.  
  33. end;
  34.  
  35.  
  36. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  37. var count, i: smallint;
  38. begin
  39.  
  40.  
  41.  
  42. Ini.WriteString('Combo','item'+inttostr(i),Form1.ComboBox1.Items.Strings[i-1]);
  43.  
  44. end;
  45. //rnt777@mail.ru
  46.  


Ответ отправил: rnt777 (статус: 1-ый класс)
Время отправки: 4 июля 2008, 06:28
Оценка за ответ: 5

Комментарий к оценке: Фенкс! ... Так тоже попробовала

Мини-форум вопроса

Всего сообщений: 0.

31 января 2011, 20:03: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:45
Выполнено за 0.04 сек.