Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2014, 10:41   #11
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Которые я и задаю.
Когда задаёшь, не надо пытаться тут же самому себе отвечать (тем более неправильно). Вот пример:
Цитата:
Как это? Создавать каждое обращение к процедуре StringList? Вряд ли будет лучше. А если создать только в FormCreate и сделать его глобальным для программы, то при ошибке не сработает Free для списка, что не хорошо. А по ходу выполнения программы таких возможностей может быть не мало. Подобные вещи я стараюсь избегать.
Цитата:
Почему? Первый вариант работает и с неотсортированным. Но подтормаживает.
Научись правильно формулировать вопросы и будешь в шоколаде. Как это сделать - ссылка ниже.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 08.10.2014, 10:49   #12
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Каждую процедуру помещать в try..except?
по хорошему так и должно быть.


Цитата:
1. Во всех ли случаях у формы выполняется событие OnClose, или в случае каких-нибудь ошибок программа может прерывать выполнение не обращаясь даже к этой функции?
при любом нормальном закрытии формы.
при насильной смерти(например диспетчером) или необработаном исключении вызова не будет(как и приложения)
Цитата:
2. Чем критично не освобождение объекта? В случае программного не освобождения выделяемая ему память очищается только при перезагрузке/выключении компьютера?
оно критично при продолжении работы приложения, так как есть утечка памяти.(у меня так одно приложения дожрало однажды до 11 гигов оперативы, хотя реально юзает 100 метров)
в винде при смерти приложения памяти очистится.
Цитата:
3. Что "работает" быстрее? StringList или динамический массив строк?
поидее массив(хотя может сейчас список в Делфях на основе массива реализован). но список проще

насчет визуализации, это крайне жирная операция по сравнению с работой с чистым списком.

вообще вам не надо удалять вечно стринглист, его можно один раз создать и потом в конце убить, а в коде лишь очищать и заполнять.
так же не забываем про состояние программы, что прога и пользователь должны знать можно ли продолжать работу или что-то не то.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.10.2014, 10:58   #13
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Когда задаёшь, не надо пытаться тут же самому себе отвечать (тем более неправильно)
это всего лишь та же попытка разобраться.
Я думаю -> у меня возникает теория, в которой иногда я сомневаюсь, либо она не совсем стыкуется с тем, что я слышу -> я задаю вопрос, в котором пытаюсь понять что именно я неправильно думаю. Иногда для этого необходимо озвучить и саму мысль, т.е., вашими словами, "тут же самому себе отвечать". Т.е. ответ самому себе для того, чтобы другие могли внести ясность в мои мысли. И уж естественно логично, что такие ответы могут быть неправильными. Если б я был уверен, что всё правильно - тогда бы я как раз и не говорил ничего.
Так что Ваше
Цитата:
Сообщение от min@y™ Посмотреть сообщение
Поскольку свои выводы ты уже сделал...Thread
тоже ошибочно.


Пепел Феникса Спасибо большое за пояснения!
Ship_1 вне форума Ответить с цитированием
Старый 08.10.2014, 11:03   #14
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
тоже ошибочно.
Ты прав, прав!

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 08.10.2014, 11:12   #15
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию


Ship_1 вне форума Ответить с цитированием
Старый 08.10.2014, 11:19   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Нет, но как я не могу предусмотреть все возможные события?
Какие события? О чем ты?
Цитата:
Во всех ли случаях у формы выполняется событие OnClose, или в случае каких-нибудь ошибок программа может прерывать выполнение не обращаясь даже к этой функции?
Нет не во всех. Если вышибить из диспетчера задач или выдернуть шнур компа событие не выполнится.
Цитата:
Чем критично не освобождение объекта? В случае программного не освобождения выделяемая ему память очищается только при перезагрузке/выключении компьютера?
Нет. Память может очишаться умной ОСью после остановки процесса, но не во всех случаях. Как правило приложения запускаемые и завершаемые не особо критичны к мусору в памяти, полагаясь на операционку, но оставлять мусор дурной тон, а в случаях программ которые не должны выключаться - опасность.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.10.2014, 12:03   #17
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Какие события? О чем ты?
Я вот об этом:
Цитата:
Сообщение от Stilet Посмотреть сообщение
А что освободить объект в соответствующем событии формы запрещено?
Или имелось ввиду только событие закрытия формы?

Спасибо за пояснения!
-------------------------------------
Результаты экспериментов с визуальными и невизуальными объектами (может, кого-нибудь натолкнёт на какую-нибудь полезную мысль).
Рассматривалось время прохождения в цикле всего списка при вводе в Edit "постане".
Разность замерялась при помощи
Код:
T1:= Time;
Цикл
T2:= Time;
ShowMessage(FormatDateTime('hh:mm:ss:zzz',T2-T1));
Эксперимент 1: исходный текст первого варианта
Код:
while (pos(AnsiLowerCase(Edit1.Text),AnsiLowerCase(ListBox1.Items.Strings[i]))<>1) and (i<ListBox1.Count-1) do inc(i);
Результат прохождения цикла при вводе : 541 мс.

Эксперимент 2: Замена обращения к ListBox на обращение к StringList.
Код:
while (pos(AnsiLowerCase(Edit1.Text),AnsiLowerCase(Slovar.Strings[i]))<>1) and (i<Slovar.Count-1) do inc(i);
Результат прохождения цикла при вводе : 281 мс.

Эксперимент 3: Возвращение к ListBox, но вынесение AnsiLowerCase у Edit за цикл.
Код:
FSZ:=AnsiLowerCase(Edit1.Text);
while (pos(FSZ,AnsiLowerCase(ListBox1.Items.Strings[i]))<>1) and (i<ListBox1.Count-1) do inc(i);
Результат прохождения цикла при вводе : 335 мс.

Эксперимент 4: Снова StringList и вынос AnsiLowerCase у Edit за цикл.
Код:
FSZ:=AnsiLowerCase(Edit1.Text);
while (pos(FSZ,AnsiLowerCase(Slovar.Strings[i]))<>1) and (i<Slovar.Count-1) do inc(i);
Результат прохождения цикла при вводе : 068 мс.

А вот вынос Slovar.Count-1 (как и ListBox1.Count-1) за цикл видимого результата не даёт.
Ship_1 вне форума Ответить с цитированием
Старый 08.10.2014, 12:40   #18
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию

перед поиском обнови стринглист. меньше лишних вычислений
Код:
i:=0
while  (i<Slovar.Count-1) do 
begin
  Slovar.Strings[i]:=AnsiLowerCase(Slovar.Strings[i]);
  inc(i);
end;
тогда поиск будет
Код:
FSZ:=AnsiLowerCase(Edit1.Text);
while (pos(FSZ,Slovar.Strings[i])<>1) and (i<Slovar.Count-1) do inc(i);
ещё вопрос какой тип у Slovar, тебе достаточно будет TStrings, так как события класса ты не используешь (типа OnChange).
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.

Последний раз редактировалось IliaIT; 08.10.2014 в 12:50.
IliaIT вне форума Ответить с цитированием
Старый 08.10.2014, 13:07   #19
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Цитата:
Сообщение от IliaIT Посмотреть сообщение
перед поиском обнови стринглист. меньше лишних вычислений
Хм... Учитывая, что он мне нужен только для получения индекса, а необходимые большие буквы всё равно хранятся в ListBox'е - логично. Спасибо за идею!

Правда, визуально у меня уже не тормозит Но усовершенствую на будущее.

Цитата:
Сообщение от IliaIT Посмотреть сообщение
ещё вопрос какой тип у Slovar, тебе достаточно будет TStrings, так как события класса ты не используешь (типа OnChange).
TStringList у меня.
Я правильно понимаю, что если он будет TStrings, то создаваться всё равно будет через Slovar:=TStringList.Create?
Ship_1 вне форума Ответить с цитированием
Старый 08.10.2014, 13:39   #20
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Хитрой задумке не суждено было реализоваться....
Для более быстрого поиска решил ограничить его область таким путём:

1. Ввёл новый глобальный список: NomPoz
2. При начальной "обработке" словаря в этот список заношу три первые буквы встречающего слова (если ещё не занёс) и индекс слова с этим началом в словаре.
Код:
  NomPoz.Add('а=0');
  For i:=0 to Slovar.Count-1 do
  begin
  ...
    if AnsiLowerCase(copy(StringGrid1.Cells[0,i],1,3))<>NomPoz.Names[NomPoz.Count-1] then NomPoz.Add(AnsiLowerCase(copy(StringGrid1.Cells[0,i],1,3))+'='+IntToStr(i));
  end;
3. При обработке ввода в Edit1 сначала ищем есть ли в списке позиций введённые три буквы; если есть - присваиваем началу диапазона поиска индекс, соответствующий этим трём буквам, а концу - индекс следующего по списку сочетания.

Код:
    i:=NomPoz.IndexOfName(copy(FSZ,1,3));
    if i>=0 then
    begin
      st:=StrToInt(NomPoz.ValueFromIndex[i]);
      fn:=StrToInt(NomPoz.ValueFromIndex[i+1]);
      i:=st;
      while (pos(FSZ,AnsiLowerCase(Slovar.Strings[i]))<>1) and (i<fn) do inc(i);
      if (i<fn) or (pos(AnsiLowerCase(Edit1.Text),AnsiLowerCase(ListBox1.Items.Strings[i]))=1) then
      begin
        ListBox1.ItemIndex:=i;
        ListBox1Click(Sender);
      end;
    end
Но для такого метода нужна строгая сортировка по алфавиту... А у меня словарь орфографический с несколько другой задумкой: слова выстроены БЕЗ учёта символов (например, "а капелла" стоит между "аканье" и "акапельный"). В этом есть своя логика, но "индексированный поиск" из-за этого обламывается...
Может, кому другому пригодится моя идея, или мне же когда-нибудь позже
----------------------------------------------------------------------------
С предварительным "прогоном" StringList через AnsiLowerCase и выносом его из цикла результат эксперимента стал 018 мс. Смена TStringList на TStrings ничего не дала.

Последний раз редактировалось Ship_1; 08.10.2014 в 13:49.
Ship_1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Постоянно слетает галочка "автоматически" в "Параметры Excel", "Формулы", "Вычисления в книге" Alexsandrr Microsoft Office Excel 4 19.10.2013 14:22
Реализация алгоритма "Решето Сундарама" для поиска простых чисел(Delphi) inviter Помощь студентам 0 12.11.2012 17:15
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40
как задать "мерность" масива и для каждого "измерения" максимальный индекс vova_ Общие вопросы Delphi 5 31.07.2012 22:14
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04