|
Вопрос # 1 744/ вопрос решён / |
|
Здравствуйте!
Работа с компонентом ComboBox:
Что нужно сделать, чтобы новое вводимое значение сохранялось с Items?
Пробовала так:
"new:=ComboBox1.Text;
Combobox1.Items.Add(new)"
В результате новое значение сохраняется, но только до тех пор, пока приложение не будет перезапущено. А надо, чтоб сохранялись навсегда.
 |
Вопрос задала: 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-файле.
привожу код с описанием
Приложение: Переключить в обычный режим- Uses IniFiles;
- ...
- var Ini: TIniFile;
- ...
-
- procedure TForm1.FormCreate(Sender: TObject);
- var count, i: smallint;
- begin
-
- Ini:=TIniFile.Create(extractfilepath(paramstr(0))+'config.ini');
-
- if Ini.SectionExists('Combo')
- then begin
- count:=ini.ReadInteger('Combo','count',-1);
-
- if count>0
- then begin
-
-
- for i:=1 to Count do
- Form1.ComboBox1.Items.Add(ini.ReadString('Combo','item'+inttostr(i),''))
-
- end;
- end;
- end;
-
-
- procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
- begin
-
-
-
- end;
-
-
- procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
- var count, i: smallint;
- begin
-
-
-
- Ini.WriteString('Combo','item'+inttostr(i),Form1.ComboBox1.Items.Strings[i-1]);
-
- end;
- //rnt777@mail.ru
-
 |
Ответ отправил: rnt777 (статус: 1-ый класс)
Время отправки: 4 июля 2008, 06:28
Оценка за ответ: 5
Комментарий к оценке: Фенкс! ... Так тоже попробовала
|
Мини-форум вопроса
Всего сообщений: 0.
31 января 2011, 20:03: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|