![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
AV при работе с TStringList [D7, WinXP]
Cobalt © (2008-07-29 13:22:00)
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
SynListCombo: TStringList;
begin
SynListCombo:= TStringList.Create;
SynListCombo.Sorted:=False;
for i:=0 to 29 do SynListCombo.Add(IntTostr(i));
SynListCombo.Add('ActDD');
//SynListEdit[29]:='29-ActDD'; //AV! Хотя строка уже существует!!!
SynListCombo.Add('ActMM');
SynListCombo.Add('ActYY');
ListBox1.Items.AddStrings(SynListCombo);
for i:=0 to 28 do ListBox1.Items.Add(IntTostr(i));
ListBox1.Items.Add('ActDD');
ListBox1.Items[29]:='29-ActDD'; // Строки даже нет еще!
ListBox1.Items.Add('ActMM');
ListBox1.Items.Add('ActYY');
end;
Если раскомментировать строку
SynListEdit[29]:='29-ActDD';
то возникает AV (независимо от существования строки)
а подобный код в ListBox никакой ошибки не вызывает.
Собственно задача - установить строки некоторых номеров в определенные значения, и для этого тащить целый визуальный контрол не хочется. (припомнив приснопамятное хранение значений в Edit1.Text)
Anatoly Podgoretsky (2008-07-30 14:43:00) [1]> Нат (30.07.2008 13:44:36) [36]
Ага
Нат (2008-07-30 13:44:00) [2]Anatoly Podgoretsky
> Нет, это он выдрал страницы.
Кто, сам Фленов?
Нат (2008-07-30 13:33:00) [3]Вот опять, да ты местами читаешь!
Anatoly Podgoretsky (2008-07-30 13:22:00) [4]> Нат (30.07.2008 12:33:32) [32]
Нет, это он выдрал страницы.
Игорь Шевченко (2008-07-30 12:59:00) [5]
> + добавляю префикс типа
нафига ? У тебя точно времени вагон
Нат (2008-07-30 12:33:00) [6]
> не стоит расчитывать на понимание.
Это верно, если у модуля десять авторов или просто это большой модуль.
Поэтому в больших, все же указываю больше одной буквы в названии переменных + добавляю префикс типа, а бывает еще и суффикс.
> например за меня
Судя по подборке литературы на Вашем сайте, Вы не чураетесь визульных сред.
А из фленова у вас выдраны страницы.
:-)
Игорь Шевченко (2008-07-30 12:27:00) [7]Нат (30.07.08 11:22) [28]
> Насчет Оккама - мимо.
Тогда нефиг такие примеры, как в [22] приводить. Этот пример - наглядная нелюбовь к Оккаму.
> Давайте держаться середины. По возможности золотой.
Давайте не держаться середины, а признавать тот факт, что программы пишутся не для компьютера, а для человека. И чем проще человеку понять программу, тем она лучше.
Anatoly Podgoretsky (2008-07-30 12:21:00) [8]
> Также как нет резона счетчику единственного цикла в "небольшом
> методе" присваивать имя CounterOfPageInBible, достаточно
> i:=0
Вопрос сложный, если я пойму что это CounterOfPageInBible то можно, а если не пойму? Паркинсон говорит, что не стоит расчитывать на понимание.
Anatoly Podgoretsky (2008-07-30 12:19:00) [9]
> Мы же пользуем визуальные редакторы, вместо того, что бы
> все прописывать ручками.
Где и отвечаешь ли ты за всех, например за меня, чтобы далеко не ходить?
Нат (2008-07-30 11:22:00) [10]Да, иногда можно использовать with, его где-то тут уже обсуждали.
Насчет Оккама - мимо.
Насчет проектирования можно обсудить,
хотя приведеный пример набран из нескольких мест для наглядности.
Насчет лени - любите Вы крайности.
Мы же пользуем визуальные редакторы, вместо того, что бы все прописывать ручками.
И Асм раньше почаще использовался. Можно копать лопатой, а можно сходит за трактором.
Давайте держаться середины. По возможности золотой.
Игорь Шевченко (2008-07-30 10:58:00) [11]Нат (30.07.08 10:56) [26]
> Давай не впадать в крайности.
> Всякому инструменту свое место.
Оккама не уважаешь. Ничего, жизнь научит.
Не стоит умножать сущности сверх необходимости.
В коде, приведенном в [22] есть как минимум одна ошибка проектирования, а ты пытаешься сделать к ней костыль
Нат (2008-07-30 10:56:00) [12]Давай не впадать в крайности.
Всякому инструменту свое место.
Короткие имена переменных также имеют право на жизнь, тем более если это локальные переменные в "небольших методах".
Также как нет резона счетчику единственного цикла в "небольшом методе" присваивать имя CounterOfPageInBible, достаточно i:=0 to ...
Anatoly Podgoretsky (2008-07-30 10:46:00) [13]Много букав, а коротко - ленивым не место в программирование.
Игорь Шевченко (2008-07-30 10:41:00) [14]Нат (30.07.08 10:31) [22]
> Как раз наоборот - дает сильную экономию времени: вместо
> длинной строки-цепочки идентификаторов пишу 3-4 символа,
> и что важнее, код легче читается.
Для write-only кода это экономия. А про чтение давай ты мне не будешь сказки рассказывать, я их уже наслушался столько, что могу выпустить собрание сочинений услышанных сказок о том, как лишние переменные с короткими именами помогают прочитать код с изначально кривыми именами переменных.
> И если вместо DSet везде написать DataModuleOffice.dsZZItemsNum_own.
> DataSet - ты утонул в буквах.
"Важной частью пропагандируемого мною стиля программирования является
разложение сложных процедур на небольшие методы. Если делать это неправильно, то придется изрядно помучиться, выясняя, что же делают эти маленькие методы.
Избежать таких мучений помогает назначение методам хороших имен. Методам следует давать имена, раскрывающие их назначение. Хороший способ для этого - представить себе, каким должен быть комментарий к методу, и преобразовать этот комментарий в имя метода.
Жизнь такова, что удачное имя может не сразу придти в голову. В подобной
ситуации может возникнуть соблазн бросить это занятие - в конце концов,
не в имени счастье. Это вас соблазняет бес, не слушайте его. Если вы видите, что у метода плохое имя, обязательно измените его. Помните, что ваш код в первую очередь предназначен человеку, а только потом - компьютеру.
Человеку нужны хорошие имена. Вспомните, сколько времени вы потратили,
пытаясь что-то сделать, и насколько проще было бы, окажись у пары методов более удачные имена. Создание хороших имен - это мастерство, требующее практики; совершенствование этого мастерства - ключ к превращению в действительно искусного программиста.
То же справедливо и в отношении других элементов сигнатуры метода.
Если переупорядочивание параметров проясняет суть - выполните его."
(с) Мартин Фаулер
Ega23 (2008-07-30 10:40:00) [15]
begin
...
with DataModuleOffice.dsZZItemsNum_own.DataSet do
begin
//хотя сейчас вместо "DataModule" пишу "dm", но так более показательно
FieldByName('ItemID').ReadOnly:=false;
Insert;
FieldByName('Type').Text :=ArrData[0];
FieldByName('Color').Text :=ArrData[1];
...
...
if (State in [dsEdit , dsInsert] ) then
Post;
end;
Нат (2008-07-30 10:31:00) [16]
> Тебе повезло, у тебя времени дофига
Как раз наоборот - дает сильную экономию времени: вместо длинной строки-цепочки идентификаторов пишу 3-4 символа, и что важнее, код легче читается.
...
var
DSet : TDataSet;
begin
...
DSet := DataModuleOffice.dsZZItemsNum_own.DataSet;
//хотя сейчас вместо "DataModule" пишу "dm", но так более показательно
DSet.FieldByName('ItemID').ReadOnly:=false;
DSet.Insert;
DSet.FieldByName('Type').Text :=ArrData[0];
DSet.FieldByName('Color').Text :=ArrData[1];
...
...
if (DSet.State in [dsEdit , dsInsert] ) then
DSet.Post;
...
И если вместо DSet везде написать DataModuleOffice.dsZZItemsNum_own.DataSet - ты утонул в буквах.
Игорь Шевченко (2008-07-30 09:50:00) [17]
> часто использую "подмену"
> var
> v : TvarBalalaHirohiro;
> ... v:=varBalalaHirohiro;
> v.proc();
> v.prop:=..
Тебе повезло, у тебя времени дофига
Игорь Шевченко (2008-07-30 09:50:00) [18]
> Для меня нагляднее
Я не собираюсь с тобой спорить о вкусах, это дело бесполезное, но загляни в исходный код VCL, поищи там слово with
Нат (2008-07-29 21:50:00) [19]часто использую "подмену"
var
v : TvarBalalaHirohiro;
... v:=varBalalaHirohiro;
v.proc();
v.prop:=..
Тын-Дын (2008-07-29 18:46:00) [20]
> или
>
> SynListCombo:= TStringList.Create;
> with SynListCombo do
> begin
> Sorted:=False;
> for i:=0 to 29 do
> Add(IntTostr(i));
> Add('ActDD');
> Add('ActMM');
> Add('ActYY');
> end;
Для меня нагляднее
SynListCombo:= TStringList.Create;
SynListCombo.Sorted := True;
for i:=0 to 29 do SynListCombo.Add(IntTostr(i));
SynListCombo.Add('ActDD');
SynListCombo.Add('ActMM');
SynListCombo.Add('ActYY');
Ну а если ещё и между with..end строчек 50, то совсем плохо.