|
Вопрос # 4 835/ вопрос решён / |
|
Здравствуйте! Уважаемые эксперты! это опять я.
в StringGrid нужно проверить содержимое ячейки и выполнить действие(изменение шрифта и цвета ячейки).
выполняю проверку (код описан).
собственно вопрос, можно ли заменить это огромное перечисление
каким-нибудь набором? пробовал Set of компилятор выдаёт ошибку про несовместимость данных.
 |
Вопрос задал: Ham_ele_on (статус: Посетитель)
Вопрос отправлен: 18 декабря 2010, 19:51
Состояние вопроса: решён, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Ham_ele_on!
Да, можно! И что интересно, оно будет даже несколько быстрее вашего кода, заметно легче модифицироваться, иметь пару плюшек и выглядеть красивее.
Для начала объявим себе где то глобально или как свойство формы TStringList, который будет хранить слова, которые нужно будет сравнивать.
private
sl:TStringList;
В конструкторе формы (FormCreate) создадим и заполним его
sl := TStringList.create;
sl.add('Привет');
sl.add('пока');
sl.add('Да');
sl.add('нет');
sl.add('возможно');
// отсортируем его.
sl.sorted := true;
// это очень хорошо, так как теперь поиск будет не ленейный, а логарифмический.
// к примеру, на 1024 элемента, при линейном поиске нужно сделать в среднем 512 шагов, а в линейном - 10
теперь при удалении формы (FormDestroy)добавим освобождение ресурсов
sl.free;
А теперь самое интересное. Условие для сравнения.
if (sl.find(SG.Cells[ACol,ARow]) <> -1) then begin
// строка найдена.
end;
Преимущества - теперь массив строк можно менять на лету - все будет работать.
Преимущество второе, скрытое. у TStringList есть свойство object, куда можно добавлять свой объект. Можно создать свои объекты, которые хранят параметры ячейки для данного слова и получать все что угодно:) Но это уже для домашнего задания.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 18 декабря 2010, 21:25
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 58; последнее сообщение — 24 февраля 2011, 11:23; участников в обсуждении: 3.
Страницы: [1] [2] [3] [Следующая »]
|
min@y™ (статус: Доктор наук), 19 декабря 2010, 07:17 [#1]:
Не find(), а IndexOf(). В остальном согласен.
Могу от себя только добавить, что хранение инфы в TStringGrid сразу выдаёт новичка.
Инфу надо хранить отдельно и отрисовывать только по мере необходимости в TDrawGrid.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ham_ele_on (статус: Посетитель), 19 декабря 2010, 08:21 [#2]:
эта таблица которая выдаёт набор данных, с последующим переносом в Excel, некоторые слова должны быть выделены, т.к. они определяют группы товаров.
Ну , а то, что я новичок, я и не скрываю 
Спасибо большое, очень помогли.
P\S. объясните плиз (sl.find(SG.Cells[ACol,ARow]) <> -1) , почему здесь -1??
|
19 декабря 2010, 08:23: Статус вопроса изменён на решённый (изменил автор вопроса — Ham_ele_on)
|
min@y™ (статус: Доктор наук), 19 декабря 2010, 10:01 [#3]:
Эта функция (indexof) врозвращает индекс найденного элемента или -1, если элемент не найден.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 19 декабря 2010, 20:55 [#4]:
to min@y™: там как раз нужно find - список то сортированный. Более того, он только для сортированных списков.
Indexof проверяет тип списка, и если он сортированный, то может вызвать find.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 20 декабря 2010, 08:25 [#5]:
Цитата (Вадим К):
там как раз нужно find - список то сортированный. Более того, он только для сортированных списков. Indexof проверяет тип списка, и если он сортированный, то может вызвать find.
Да я и не возражаю. Тогда исправь свой ответ: в методе Find() два параметра.
function Find(const S: string; var Index: Integer): Boolean; virtual;
Именно поэтому я подумал, что ты имел в виду IndexOf().
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
20 декабря 2010, 10:03: Вопрос перемещён из тематического раздела Delphi » Работа с файловой системой в раздел Delphi » Работа с компонентами и библиотеками модератором Ерёмин А.А.
|
Вадим К (статус: Академик), 20 декабря 2010, 10:44 [#6]:
смотрел в своих сорцах. по моему, это определение менялось. А сейчас оно уже такое. Нет проблем - пишем так
var k:integer;
if (sl.find(SG.Cells[ACol,ARow], k)) then begin
// строка найдена. k - ее позиция
end;
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Ham_ele_on (статус: Посетитель), 25 декабря 2010, 22:07 [#7]:
<quote> у TStringList есть свойство object, куда можно добавлять свой объект.</quote>
а где про это прочитать, в и-нете полазил, все пишут про это свойство, а как с ним работать никто не говорит.
|
|
min@y™ (статус: Доктор наук), 26 декабря 2010, 09:38 [#8]:
Цитата (Ham_ele_on):
а где про это прочитать, в и-нете полазил, все пишут про это свойство, а как с ним работать никто не говорит.
А что тут непонятно-то? Спрашивай, мы объясним. Я регулярно привязываю объекты к таким свойствам, как:
- TStrings.Objects;
- TListItem.Data;
- TTreeNode.Data.
Очень удобно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ham_ele_on (статус: Посетитель), 6 января 2011, 17:22 [#9]:
наверное нужно начать с того, Что такое "Objects"?
является ли record объектом?
ещё такой вопрос(если можно то я не буду оформлять новый вопрос). как сделать, что бы кнопка или пункт меню, были неактивными, до тех пор, пока не произойдёт изменение на форме.пример, кнопка сохранения в программах.?
|
|
Вадим К (статус: Академик), 6 января 2011, 17:26 [#10]:
>>наверное нужно начать с того, Что такое "Objects"?\
просто свойство, не более.
>>является ли record объектом?
вообще то нет. Но в некоторых случаях можно считать, что да.
>>пока не произойдёт изменение на форме.пример, кнопка сохранения в программах
а в чем проблема - просто делаем вначале button.enable := false;
а потом. когда нужно button.enable := true;
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Ham_ele_on (статус: Посетитель), 6 января 2011, 17:41 [#11]:
а как отследить изменения??? компонентов то много или для каждого компонента писать???
|
|
Вадим К (статус: Академик), 6 января 2011, 17:44 [#12]:
а их не нужно отслеживать. если это кнопка сохранения, то кто напишет код сохранения? вот рядом и приписываем блокировку. а в memo.onchange делаем разблокировку. и всех то делов.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Ham_ele_on (статус: Посетитель), 16 февраля 2011, 22:33 [#13]:
доброго времени суток.
добрался я до "вкусненького" и опять в тупике.
в StringList есть возможность загрузки из файла(это я освоил),
но вот вопрос, а можно ли создать список списков, загружаемый из файла и как должен выглядеть файл?
пример: ABC=1,2,3,5,4. dce=0,9,8,7,6 и т.д.
если я верно мыслю, то нужно создать дополнительные StringList
и пркрепить их к основному по средством AddObjects.
помогите разобраться пожалуйста.
|
|
Вадим К (статус: Академик), 16 февраля 2011, 22:45 [#14]:
создать то никто не мешает, но загружать придется вручную.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Ham_ele_on (статус: Посетитель), 16 февраля 2011, 23:06 [#15]:
ну это я понимаю, можно немного подробнее??
в целом меня устроят и отдельные StringList но как их из одного файла прочитать?? как файл должен выглядеть?
и ещё вопрос возник, можно ли влиять на процесс сортировки, а то получается, что 8 стоит после 12.
|
|
Вадим К (статус: Академик), 17 февраля 2011, 00:03 [#16]:
как должен выглядеть файл? а это как Вам в голову взбредет. Может сейчас подбежит min@y™ и посоветует xml (он тут может быть уместным).
Почему 8 стоит после 12? потому что StringList не знает, что у Вас там цифры. Он сортирует строки (неожиданно, правда? )
А поэтому сортировка логична.
В принципе StringList можно обучить "правильной сортировке" - нужно только определить свою функцию сравнения элементов, а дальше он сам уже.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Ham_ele_on (статус: Посетитель), 17 февраля 2011, 07:53 [#17]:
файл проще, наверное, текстовый.
вопрос был "можно ли влиять на процесс сортировки?".если можно то как?
|
|
min@y™ (статус: Доктор наук), 17 февраля 2011, 08:18 [#18]:
Цитата (Ham_ele_on):
вопрос был "можно ли влиять на процесс сортировки?".если можно то как?
Да, можно. У TStringList есть метод CustomSort. Вот его-то и надо юзать.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ham_ele_on (статус: Посетитель), 17 февраля 2011, 09:46 [#19]:
>У TStringList есть метод CustomSort.
много чего прочитал но чёт так и не понял, как это работает.
можете своими словами или примером?
|
|
min@y™ (статус: Доктор наук), 17 февраля 2011, 10:02 [#20]:
Цитата (Ham_ele_on):
много чего прочитал но чёт так и не понял, как это работает. можете своими словами или примером?
Неужели трудно погуглить? Вот тебе БОЛЬШАЯ ССЫЛКА.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Страницы: [1] [2] [3] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|