![]() |
|
![]() ![]() ![]() |
|
SneG0K |
|
|||
![]() Max Mara ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1887 Регистрация: 1.12.2007 Где: Wis Dells Репутация: 1 Всего: 54 |
И заблуждение №11.
11)Почему юзать Дельфи, а не что-то другое? Ответ:Потомушто ДЕЛЬФИ РУЛИТ!!!! ![]() ![]() ![]() Ссори за ![]() |
|||
|
||||
THandle |
|
||||||||||||||||||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 1 Всего: 372 |
Из записок Ивана:
12 ноября. Решил вести дневник. Пусть будущее поколение знает как герои изучали Delphi. Сегодня ознакомился с интерфейсом. Классная вещь вам скажу. Скачал учебник. Читаю. 16 ноября. Прочитал учебник. Теперь мне многое понятно. Надо написать какую-нибудь программку. И я даже знаю какую... 28 ноября. Узнал сегодня что со строками можно работать как с массивом. Я был ваще в шоке. Стал переделывать все. Чтоб круче было. И возникла одна маленькая проблемка:
Почему-то код вызывает ошибку:( почему не понимаю. Видимо из за глюков в Delphi. Вообще если так вот посмотреть с проффесианальной точки зрения ошибок очень много. Абсолютно непонятно чем не понравился мой код этому компелятору? Ведь строка же это массив символов, который наченается с нуля. Последним элементом является длина этого массива вычисляемая очень полезной функцией Length, которую я случайно обнаружил и благодаря опытам установил что она возвращает длину строки. Ладно, не будем работать со строками как с массивом, раз они не хотят... 8 декабря. Случайно прочитал сегодня где-то в интернете, что строка начинается с 1, а в нулевом элементе хранится её длина. А заканчивается строка её длиной(странно по моему, ну пусть будет так, раз по другому не смогли сделать). Переделал свой код. И правда работает. Как я сам не догадался?
11 декабря. Обнаружил сегодня интересный класс: Tstringlist. Очень полезная вещь для работы с файлами. 14 декабря. Класс оказался неправильный какой-то. Не работает:( Представляете, запустил в цикле добавление всех строк из моего StringList'а в Memo, а получилось так что первый элемент он игнорирует, а потом еще и ошибку выбрасывает:(
Очень подозрительно, согласитесь? 19 декабря. Да уж. Предыдущий опыт со строками должен был научить меня тому что в Delphi и в программировании вообще(я же теперь еще и Assembler отлично знаю, пишу сайты на PHP и собираюсь браться за C++, чтобы разрабатывать 3Д-игры). Оказывается что во всех таких классах нумерация элементов идет не как в строках, а с 0, а заканчивается, видите ли, числом Count — 1. Потому что начальное значение Count = 1, а начинается список элементов с 0. Интересно кто такое придумал? Повесить его надо. Не поянтности какие то делают. Ужас полный. Вот в общем мой код. Прикиньте, работает:
А вообще в одной хорошей сатейке в интернете, кстати на том же сайте на котором я узнал и про строки, нашел еще то что оказывается у класса TstringList есть такая процедура AddStrings(там было написано что это метод, но что такое метод я не знаю почему-то, хотя учебник прочитал). В общем он неслабо упрощает мою задачу:
Добавляет все строчки без проблем вообще. Я со спокойной душой начинаю праздновать новый год. 18 января. Ну вот, отлично отпраздновал новый год. Теперь вот вспомнил что у меня программа недописанная лежит. Решил сесть подумать что дальше делать. Полазил по нету. Удалось установить что к элементам списка строк можно обращаться прямо как массиву, а не через Strings. Объяснено это было тем что Strings объявлено с какой-то там директивой default. Ну да ладно. Пусть объявлено. Главное — работает. Мой прошлый код я модифицировал в вот что:
Работает супер. 20 января. Где то прочитал что объекты надо уничтожать деструктором. Переделал свой код:
Почему-то при повторном нажатии на кнопку выскакивает ошибка:( Destroy убираю — всё нормально. Статья видимо не правильная была. 26 января. Прочитал где-то что нужно освобождать память за объектами не Destroy'м, а неким Free. Попробовал — ошибок нет, хотя результат тот же что и без него. Ну да ладно, пускай будет. Вот мой новый код:
29 января. Сегодня абсолютно случайно обнаружил что у меня в программе можно и не использовать TstringList, так как в сам Memo можно точно так же загружать файл. Теперь мой код выглядит так:
Это сообщение отредактировал(а) THandle - 11.6.2008, 14:54 |
||||||||||||||||||
|
|||||||||||||||||||
THandle |
|
|||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 1 Всего: 372 |
Естественно в конце, после всего этого дневника Вани последует подробное объяснение чего не так и тд.
![]() |
|||
|
||||
Wedafl |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 12.5.2008 Где: Москва Репутация: нет Всего: нет |
На тему конструктора, лично я часто пишу так
И не понимаю чем это плохо. |
|||
|
||||
THandle |
|
|||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 1 Всего: 372 |
Wedafl, обработку исключений конструктора лучше оставлять обработчику более высокого уровня, нежели try..finally..end;
|
|||
|
||||
Bose |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 1 Всего: 51 |
Вот ещё совет-грабли, - уже раз n-дцать на них наступал.
Надо к примеру нам подчистить какой-нибудь списочек. Пример покажу на TStringList. Предположим что нам нужно удалить пустые строки из файла.
А вот ещё кстати частая ошибка
|
||||
|
|||||
THandle |
|
|||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 1 Всего: 372 |
Bose, ну хоть кто-то наконец то что-то предложил
![]() Буду дописывать. ![]() ![]() Это сообщение отредактировал(а) THandle - 5.6.2008, 08:54 |
|||
|
||||
Bose |
|
||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 1 Всего: 51 |
Этот пример получился слишком замороченный, но у меня не раз возникали такие проблемы:
Предположим, что Иван узнал что формы можно создавать динамически, и даже стал использовать оператор assign. Дано: Все переменные форм объявлены как глобальные(по умолчанию дельфи так и делает).
При создании форм Иван проверяет, не была ли эта форма уже создана. Пример
А потом Иван узнал что глобальные переменные - это зло и решил сделать все глобальные переменные локальными:
И стал получать Access Violation, ибо неициализированные локальные переменные, не равны nil, так что условие not assigned(Form1) никогда не срабатывает. Добавлено @ 14:09 А вот ещё вредный совет, на этот раз ООП-шный:
Если мы перегружаем какой-либо метод в наследнике, не в коем случае не используем директиву override ![]() Это сообщение отредактировал(а) Bose - 5.6.2008, 14:10 |
||||||||
|
|||||||||
THandle |
|
||||||||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 1 Всего: 372 |
Это то же самое что и со строками, загоню в один "раздел" их ![]() Про строки я имел ввиду вот это:
Хороший пример ![]()
Ага ![]() Вообще постараюсь по-чуть чуть писать, но так как времени не много то быстро не получится ![]() А вы пока предлагайте новые идеи. Надо хотя бы не меньше 20 пунктов сделать а пока только 12: 1. Работа со строками в цикле. Почему с 1, а не с 0. 2. Работа со списками. Почему с 0, а не с 1. 3. Почему конструктор надо вызывать не как обычный метод? 4. Почему конструктор надо вызывать до try..finally..end? 5. Почему нельзя уничтожить объект в своем же обработчике? 6. Почему надо вызывать не Destroy, а Free? 7. Почему в цикле for нельзя менять значение переменной-счетчика этого же цикла? 8. Эквивалентны ли записи if b = true then и if b then? 9. Почему в цикле for со строками не надо вводить еще одну переменную в которую будет перед циклом заносится длина строки, и эта переменная будет являться конечным значением цикла? 10. Почему в цикле for 0т 1 до длины некоторой строки и удалении некоторых знаков из этой строки, удаляются не все знаки? То же самое относится и к удалению строк в TStringList. 11. Локальные переменные, которые при not Assigned выкидывают AV. 12. Override в перекрытом методе в наследнике какого-то класса. Буду постепенно писать. Всем удачи!!! |
||||||||
|
|||||||||
Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 1 Всего: 51 |
Корректура:
THandle, дальше код идёт, и там тоже i с 0 по length-1. Опечатка по ходу =) |
|||
|
||||
THandle |
|
|||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 1 Всего: 372 |
||||
|
||||
THandle |
|
|||
![]() Хранитель Клуба ![]() Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 1 Всего: 372 |
Решил в свободное время возобновить работу над проектом.
Если есть еще предложения - пишите. |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: нет Всего: 88 |
это ж только про шортстринги!
Добавлено через 8 минут и 8 секунд
на самом деле, даже если бы конечное значение и ращитывалось на каждой итерации, то ничего страшного все равно бы не случилось. Эта страшилка с длиной строки растет из сей, где для нахождения длины строки люди сканировали ее в поисках нуля. Это делало алгоритм квадратичным. А дельфовая функция length благополучно проверяет поле длины строки по отрицательному смещению от первого символа, поэтому ее можно использовать и в условиях для цикла while без присваивания переменной -------------------- Обижено школьников: 8 |
|||
|
||||
roschinspb |
|
||||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 27.1.2010 Где: С-Пб Репутация: нет Всего: нет |
На тему дэльфовых заблуждений:
Всегда надо делать так:
Ни в коем случае не так:
|
||||
|
|||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Форум группы: Vingrad Delphi - Voluntary Writers Group | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |