Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 535
от 18.07.2006, 00:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 364, Экспертов: 63
В номере:Вопросов: 2, Ответов: 5


Вопрос № 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.34 от 01.06.2006
Яндекс Rambler's Top100

В избранное