Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.09.07;
Скачать: [xml.tar.bz2];

Вниз

AV при работе с TStringList   Найти похожие ветки 

 
Cobalt   (2008-07-29 13:22) [0]

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)


 
tesseract ©   (2008-07-29 13:26) [1]


>  for i:=0 to 28 do ListBox1.Items.Add(IntTostr(i));
>  ListBox1.Items.Add("ActDD");
>  ListBox1.Items[29]:="29-ActDD"; // Строки даже нет еще!
>


Как нет ? 30 строк ты и добавил.


 
han_malign ©   (2008-07-29 13:29) [2]


>  ....SynListCombo.....
>  //SynListEdit[29]:="29-ActDD"; //AV! Хотя строка уже существует!!!

???


 
Palladin ©   (2008-07-29 13:37) [3]


> ListBox1.Items[29]:="29-ActDD"; // Строки даже нет еще!

ну правильно, нет этого пункта, и вполне логичный вопрос, на кой обращаешься к несуществующему пункту, при этом еще и ожидая какого то, отличного от ошибки, результата?


 
Palladin ©   (2008-07-29 13:40) [4]

просшу просчения, не то процитировал,


> //SynListEdit[29]:="29-ActDD"; //AV! Хотя строка уже существует!

вот это нужно было процитировать


 
Cobalt   (2008-07-29 13:43) [5]

2 han_malign ©   (29.07.08 13:29) [2]
Блин, глаз замылился :(

Спасибо!


 
Anatoly Podgoretsky ©   (2008-07-29 13:44) [6]


>  //SynListEdit[29]:="29-ActDD"; //AV! Хотя строка уже существует!
> !!

Строка существует, а вот SynListEdit нет


 
Медвежонок Пятачок ©   (2008-07-29 13:45) [7]

может и существует, но там нет 29 элемента


 
Anatoly Podgoretsky ©   (2008-07-29 13:48) [8]

Не существует, AV бы не было.


 
Slym ©   (2008-07-29 13:58) [9]

повод задуматься об использовании конструкции вида
with SynListCombo do
begin
 Sorted:=False;
 ...
end;


 
Тын-Дын ©   (2008-07-29 14:21) [10]


> повод задуматься об использовании конструкции вида
> with SynListCombo do
> begin
>  Sorted:=False;
>  ...
> end;


Не стоит задумываться.
Такую конструкцию стоит использовать только в полностью прозрачных и простых конструкциях, не предполагающих отладки кода.


 
Slym ©   (2008-07-29 14:28) [11]

Тын-Дын ©   (29.07.08 14:21) [10]
Такую конструкцию стоит использовать только в полностью прозрачных и простых конструкциях

куда уж проще - ничего кроме адд:
Cobalt   (29.07.08 13:22)
for i:=0 to 29 do SynListCombo.Add(IntTostr(i));
SynListCombo.Add("ActDD");
SynListCombo.Add("ActMM");
SynListCombo.Add("ActYY");

ничего кроме адд


 
Игорь Шевченко ©   (2008-07-29 14:28) [12]


> Не стоит задумываться.


стоит - TStringList.Sorted давно уже отлажен


 
Leonid Troyanovsky ©   (2008-07-29 14:35) [13]


> Тын-Дын ©   (29.07.08 14:21) [10]

> прозрачных и простых конструкциях, не предполагающих отладки
> кода.

Во-ще-то, есть Watch List, а в данном случае и Debug Inspector.

--
Regards, LVT.


 
Тын-Дын ©   (2008-07-29 15:18) [14]


> Игорь Шевченко ©   (29.07.08 14:28) [12]
>
> > Не стоит задумываться.
>
>
> стоит - TStringList.Sorted давно уже отлажен


Если толтько одна строчка - возможно.


> Во-ще-то, есть Watch List, а в данном случае и Debug Inspector.


А он покажет поля этого объекта?


 
Тын-Дын ©   (2008-07-29 15:21) [15]

В принципе да - покажет. Но увидеть можно только те поля, которые используются в with..end;


 
Тын-Дын ©   (2008-07-29 15:21) [16]


> Slym ©   (29.07.08 14:28) [11]
> Тын-Дын ©   (29.07.08 14:21) [10]
> Такую конструкцию стоит использовать только в полностью
> прозрачных и простых конструкциях
> куда уж проще - ничего кроме адд:


Зато наглядно.


 
Игорь Шевченко ©   (2008-07-29 16:59) [17]

кто нагляднее ?


>  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");


или

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;


 
Тын-Дын ©   (2008-07-29 18:46) [18]


> или
>
> 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, то совсем плохо.


 
Нат   (2008-07-29 21:50) [19]

часто использую "подмену"
var
v : TvarBalalaHirohiro;
... v:=varBalalaHirohiro;
v.proc();
v.prop:=..


 
Игорь Шевченко ©   (2008-07-30 09:50) [20]


> Для меня нагляднее


Я не собираюсь с тобой спорить о вкусах, это дело бесполезное, но загляни в исходный код VCL, поищи там слово with


 
Игорь Шевченко ©   (2008-07-30 09:50) [21]


> часто использую "подмену"
> var
> v : TvarBalalaHirohiro;
> ... v:=varBalalaHirohiro;
> v.proc();
> v.prop:=..


Тебе повезло, у тебя времени дофига


 
Нат   (2008-07-30 10:31) [22]


> Тебе повезло, у тебя времени дофига

Как раз наоборот - дает сильную экономию времени: вместо длинной строки-цепочки идентификаторов пишу 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 - ты утонул в буквах.


 
Ega23 ©   (2008-07-30 10:40) [23]


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:41) [24]

Нат   (30.07.08 10:31) [22]


> Как раз наоборот - дает сильную экономию времени: вместо
> длинной строки-цепочки идентификаторов пишу 3-4 символа,
>  и что важнее, код легче читается.


Для write-only кода это экономия. А про чтение давай ты мне не будешь сказки рассказывать, я их уже наслушался столько, что могу выпустить собрание сочинений услышанных сказок о том, как лишние переменные с короткими именами помогают прочитать код с изначально кривыми именами переменных.


> И если вместо DSet везде написать DataModuleOffice.dsZZItemsNum_own.
> DataSet - ты утонул в буквах.


"Важной частью пропагандируемого мною стиля программирования является
разложение сложных процедур на небольшие методы. Если делать это неправильно, то придется изрядно помучиться, выясняя, что же делают эти маленькие методы.
Избежать таких мучений помогает назначение методам хороших имен. Методам следует давать имена, раскрывающие их назначение. Хороший способ для этого - представить себе, каким должен быть комментарий к методу, и преобразовать этот комментарий в имя метода.
Жизнь такова, что удачное имя может не сразу придти в голову. В подобной
ситуации может возникнуть соблазн бросить это занятие - в конце концов,
не в имени счастье. Это вас соблазняет бес, не слушайте его. Если вы видите, что у метода плохое имя, обязательно измените его. Помните, что ваш код в первую очередь предназначен человеку, а только потом - компьютеру.
Человеку нужны хорошие имена. Вспомните, сколько времени вы потратили,
пытаясь что-то сделать, и насколько проще было бы, окажись у пары методов более удачные имена. Создание хороших имен - это мастерство, требующее практики; совершенствование этого мастерства - ключ к превращению в действительно искусного программиста.
То же справедливо и в отношении других элементов сигнатуры метода.
Если переупорядочивание параметров проясняет суть - выполните его."

(с) Мартин Фаулер


 
Anatoly Podgoretsky ©   (2008-07-30 10:46) [25]

Много букав, а коротко - ленивым не место в программирование.


 
Нат   (2008-07-30 10:56) [26]

Давай не впадать в крайности.
Всякому инструменту свое место.
Короткие имена переменных также имеют право на жизнь, тем более если это локальные переменные в "небольших методах".
Также как нет резона счетчику единственного цикла в "небольшом методе" присваивать имя CounterOfPageInBible, достаточно i:=0 to ...


 
Игорь Шевченко ©   (2008-07-30 10:58) [27]

Нат   (30.07.08 10:56) [26]


> Давай не впадать в крайности.
> Всякому инструменту свое место.


Оккама не уважаешь. Ничего, жизнь научит.
Не стоит умножать сущности сверх необходимости.

В коде, приведенном в [22] есть как минимум одна ошибка проектирования, а ты пытаешься сделать к ней костыль


 
Нат   (2008-07-30 11:22) [28]

Да, иногда можно использовать with, его где-то тут уже обсуждали.
Насчет Оккама - мимо.
Насчет проектирования можно обсудить,
хотя приведеный пример набран из нескольких мест для наглядности.
Насчет лени - любите Вы крайности.
Мы же пользуем визуальные редакторы, вместо того, что бы все прописывать ручками.
И Асм раньше почаще использовался. Можно копать лопатой, а можно сходит за трактором.
Давайте держаться середины. По возможности золотой.


 
Anatoly Podgoretsky ©   (2008-07-30 12:19) [29]


> Мы же пользуем визуальные редакторы, вместо того, что бы
> все прописывать ручками.

Где и отвечаешь ли ты за всех, например за меня, чтобы далеко не ходить?


 
Anatoly Podgoretsky ©   (2008-07-30 12:21) [30]


> Также как нет резона счетчику единственного цикла в "небольшом
> методе" присваивать имя CounterOfPageInBible, достаточно
> i:=0

Вопрос сложный, если я пойму что это CounterOfPageInBible то можно, а если не пойму? Паркинсон говорит, что не стоит расчитывать на понимание.


 
Игорь Шевченко ©   (2008-07-30 12:27) [31]

Нат   (30.07.08 11:22) [28]


> Насчет Оккама - мимо.


Тогда нефиг такие примеры, как в [22] приводить. Этот пример - наглядная нелюбовь к Оккаму.


> Давайте держаться середины. По возможности золотой.


Давайте не держаться середины, а признавать тот факт, что программы пишутся не для компьютера, а для человека. И чем проще человеку понять программу, тем она лучше.


 
Нат   (2008-07-30 12:33) [32]


> не стоит расчитывать на понимание.

Это верно, если у модуля десять авторов или просто это большой модуль.
Поэтому  в больших, все же указываю больше одной буквы в названии переменных + добавляю префикс типа, а бывает еще и суффикс.


>  например за меня

Судя по подборке литературы на Вашем сайте, Вы не чураетесь визульных сред.
А из фленова у вас выдраны страницы.
:-)


 
Игорь Шевченко ©   (2008-07-30 12:59) [33]


>  + добавляю префикс типа


нафига ? У тебя точно времени вагон


 
Anatoly Podgoretsky ©   (2008-07-30 13:22) [34]

> Нат  (30.07.2008 12:33:32)  [32]

Нет, это он выдрал страницы.


 
Нат   (2008-07-30 13:33) [35]

Вот опять, да ты местами читаешь!


 
Нат   (2008-07-30 13:44) [36]

Anatoly Podgoretsky

> Нет, это он выдрал страницы.

Кто, сам Фленов?


 
Anatoly Podgoretsky ©   (2008-07-30 14:43) [37]

> Нат  (30.07.2008 13:44:36)  [36]

Ага



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.09.07;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.009 c
2-1217343723
Vikindos
2008-07-29 19:02
2008.09.07
2 просесса в одном приложении


3-1205319290
rebroff
2008-03-12 13:54
2008.09.07
Повторяющиеся значения поля


2-1216916846
koss
2008-07-24 20:27
2008.09.07
Отчет


15-1216176501
Slider007
2008-07-16 06:48
2008.09.07
С днем рождения ! 16 июля 2008 среда


3-1205271880
GanibalLector
2008-03-12 00:44
2008.09.07
backup/restore Firebird





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский