Вопрос № 48869: Добрый вечер.
Возникло 2 вопроса косающиюхся ListBox
1. Каким образом в ListBox сделать отмену действия. Скажем удалил строчки, а хочу вернуть обратно.
2. Удаляю строчку вот так:
if key = 46 then
ListBox1.DeleteSe...Вопрос № 48934: Здравствуйте, эксперты!
Подскджите, п-та, можно ли считать системную переменную разделителя целой и дробной части из настройки региональных параметров панели управления. Или подскажите другой выход для корректной работы приложений Delphi на други...
Вопрос № 48.869
Добрый вечер.
Возникло 2 вопроса косающиюхся ListBox
1. Каким образом в ListBox сделать отмену действия. Скажем удалил строчки, а хочу вернуть обратно.
2. Удаляю строчку вот так:
if key = 46 then
ListBox1.DeleteSelected;
После удаления выделяется самая последняя строка в ListBox, а нужно чтобы выделялась верхняя над удаленной.
С Уважением, Максим
Отправлен: 12.07.2006, 00:11
Вопрос задал: Maximus (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Решетник Д
Здравствуйте, Maximus!
я думаю, что стоит создать массив структур.. вообще лучше сделать СТЭК!
а так - массив:
type
PUndo = ^TUndo;
Tundo = record
index: integer;
capt: string;
end;
var undos: array [1..MAX] of PUndo;
при изменении списка (удалении), нужно выделять память под новый элемент массива и записывать в него индекс элемента и заголовок.
Выделение что-то типа getmem(undos[i], sizeof(TUndo));
доступ к элементам
undos[i]^.index;
когда пользователь удаляет элемент, Вы заполняете новую ячейку массива, а курсор устанавливаете на элемент index-1 (обязательно нужно проверять наличие такого элемента!)
когда пользователь нажимает отмену, нужно взять ПОСЛЕДНИЙ элемент массива, вставить его в позицию index и обязательно освободить память через например freemem(undos[i], sizeof(TUndo));
Вот в принципе и все.
удачи
--------- Жизнь коротка, чтобы писать на ассемблере
Ответ отправил: Решетник Д (статус: 10-ый класс)
Ответ отправлен: 12.07.2006, 09:17
Отвечает: Татьяна
Здравствуйте, Maximus!
Что касается второго вопроса, это сделать достаточно просто - запоминать перед этим индекс удаляемого, а затем жестко выделять другой. Примерно так:
index := ListBox1.ItemIndex;
listbox1.DeleteSelected;
if index > 0 then ListBox1.ItemIndex := index-1;
--------- Возможно все. И ничего возможно тоже.
Ответ отправила: Татьяна (статус: Студент)
Ответ отправлен: 12.07.2006, 16:44
Отвечает: Gh0stik
Здравствуйте, Maximus!
Советую Вам сохранять удаленные элементы в списке типа TStringList. Соответственно все удаленные элементы у Вас будут храниться в списке Undo в обратном порядке (от порядка их удаления), остается только придумать как их вернуть в нужную позицию...
var Undo:TStringList;
//при создании формы
procedure TForm1.FormCreate(Sender: TObject);
begin
Undo:=TStringList.Create;
end;
//удаляем элемент
procedure TForm1.Button13Click(Sender: TObject);
var selct:integer;
begin
selct:=ListBox3.ItemIndex;
Undo.Add(Inttostr(selct)+'#'+ListBox3.Items[selct]);{# - разделитель текста и номера удаленного элемента}
ListBox3.DeleteSelected;
if selct>0 then selct:=selct-1;
ListBox3.Selected[selct]:=true;
end;
//восстанавливаем элемент (на его "законное место")
procedure TForm1.Button15Click(Sender: TObject);
var mesto:integer;
st:string;
begin
st:=Undo.Strings[Undo.Count-1];
mesto:=StrToInt(copy(st,1,pos('#',st)-1));
ListBox3.Items.Insert(mesto,copy(st,pos('#',st)+1,length(st)-pos('#',st)));
Undo.Delete(Undo.Count-1);
end;
Да при выходе из приложения не забывайте удалять список Undo.
Например, Undo.Free;
Удачи!!!
--------- Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаются события на Земле. Генератор случайных чисел - и только.
Ответ отправил: Gh0stik (статус: Студент)
Ответ отправлен: 13.07.2006, 17:39
Вопрос № 48.934
Здравствуйте, эксперты!
Подскджите, п-та, можно ли считать системную переменную разделителя целой и дробной части из настройки региональных параметров панели управления. Или подскажите другой выход для корректной работы приложений Delphi на других компьютерах.
Ошибка - " is not a valid floating point value".
Отправлен: 12.07.2006, 16:43
Вопрос задал: Ramil (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Татьяна
Здравствуйте, Ramil!
Символ разделителя хранится в переменной DecimalSeparator модуля SysUtils. Вы также можете его менять, только не забывайте потом возвращать старое значение (хороший стиль)
--------- Возможно все. И ничего возможно тоже.
Ответ отправила: Татьяна (статус: Студент)
Ответ отправлен: 12.07.2006, 16:51 Оценка за ответ: 5
Отвечает: Решетник Д
Здравствуйте, Ramil!
Ошибка - " is not a valid floating point value".
Могу предположить, что Вы исопльзуете функцию strtofloat. И коем-то образом на входе у Вас оказывается пустая строка.
--------- Жизнь коротка, чтобы писать на ассемблере
Ответ отправил: Решетник Д (статус: 10-ый класс)
Ответ отправлен: 13.07.2006, 09:55