Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Это нужно знать, записки диверсанта 
:(
    Опции темы
THandle
Дата 23.3.2008, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 1
Всего: 372



Приветствую всех свободны писателей этой группы!!! smile 

У новичков очень часто бывают залблуждения относительно вопросов программирования на Делфи.

В данной теме мы попробуем создать список наиболее часто встречающихся заблуждений и написть по ним небольшой рассказ от имени молодого "диверсанта" взявшегося постигать глубины Дефли. На пути у него будет много сложностей(как раз это и есть наш список заблуждений), и он будет их решать, и что самое удивительное, всегда будет решать неверно.
После такого "обучения" он придет на сей славный форум и начнет советовать другим свои неверные решения. 
Наши доблестные ребята укажут ему в чем он не прав и помогут ему с его неверным кодом, исправят, объяснят, и вскоре наш "диверсант" поймет всю правду правду жизни и встанет на верный путь.


Вот такой вот вкратце сюжет нашего рассказа. Писать его я берусь(не получится - сформулируем по-другому smile ), а в данной теме как раз таки собираем заблуждения.
Тут можно представлять как уже готовые заблуждения(красиво написанные, прозаичные и тд.), а можно просто давать код, к которому напишем объяснение и тд.


Значит так, нашел пока только следующее, тороплюсь, завтра еще выложу:

Циклы работы со строками начинай с нуля, а заканчивай длиной строки минус 1:

Код

var
  s : string;
  i : integer;
begin
  for i := 0 to Length(s) - 1 do
    s[i] := ...;
 end;


А циклы со списками начинай с 1 до List.Count:

Код

var
  List : TSomeList;
  i : integer;
begin
  for i := 1 to List.Count do
    List.Add(...);
end;


Сейчас поищу, что то наверное папку с этими заблууждениями удалил smile 


За флуд в данной теме всем будут выставлены минус!!! Так что не флудим товарищи(на всякий случай).

Добавлено через 13 минут и 36 секунд
Конструктор объекта надо вызывать в блоке try..finally..end;

Код

var
  SomeClass : TSomeClass;
begin
  try
    SomeClas := TSomeClass.Create;
    //что то делаем
  finally
    SomeClass.Free;
end;


Это сообщение отредактировал(а) THandle - 23.3.2008, 20:11
PM   Вверх
SneG0K
Дата 23.3.2008, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 1
Всего: 54



Оператор with..do

Изучая дельфи по Фленову, я узнал много, много, чего даже не стоит знать) И только благодаря Thandle я стал на путь истинный! Так, что лучше купить Пачеко, чем Фленова.

Так вот, из всего того я не знал про оператор with..do... И в многих примерах пугался его и переписывал!

Давай создадим некую структуру
Код

structure = record
first:string;
second:string;
end;
TStructure=^structure;


Как бы мы заполняли эту структуру?
Код

var
 s:TStructure;
.....
 s.first:='first element of structure';
 s.seconf:='second element of structure';
\\И в том же духе

Но можно сделать это немножко в меньше кода
Код

with s do
 begin
  first:='First element';
  second:='Second element';
 end;

Вообщем надеюсь суть понятна. Оператор with..do позволяет получить доступ к переменным какой-либо структуры или юнита, без указания такового) Разницы то в общем нет, но иногда юнит или структура имеет такое "красивое" название...
Так же можно делать так
Код

 with Structure1,structure2 do
 end;

Что позволит получить доступ к переменным Structure1 и structure2.... Вообщем ничего сложного)

Это сообщение отредактировал(а) SneG0K - 23.3.2008, 20:40
PM WWW Skype   Вверх
THandle
Дата 23.3.2008, 20:36 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 1
Всего: 372



Цитата(SneG0K @  23.3.2008,  20:31 Найти цитируемый пост)
Так же можно делать так
Выделить всёкод Pascal/Delphi
1:
2:
    
 with Structure1,structure2 do
 end;

Что позволит получить доступ к переменным Structure1 и structure2.... Вообщем ничего сложного) 


Вот это уже сюда подходит))) Именно так я считаю делать не надо, и многие заблуждаются.

Попробуй например:

Код

with Button1, Label1 do
   Caption := 'SomeText';




Очень любопытно получается. smile 
PM   Вверх
THandle
Дата 24.3.2008, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 1
Всего: 372



Значит так, вот еще пара штук:


1. Не стоит удалять динамически созданные объяекты, Делфи умный, он сам их удалит, лучше заняться чем-нибудь более интересным.


2. Чем больше кода ты запихнешь в Synchronize своей дополнительной нити, тем быстрее она будет работать. 

PM   Вверх
THandle
Дата 28.3.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 1
Всего: 372



Начало почти готово Думаю в понедельник вторник выложу. smile 

Вот еще:

Создавать объект надо так:

Код

var
  SomeObject : TSomeObject;
begin
  SomeObject.Create(...);
end;


а не так:

Код

var
  SomeObject : TSomeObject;
begin
  SomeObject := TSomeObject.Create(...);
end;



Напомню, что все советы тут являются довольно таки вредными, и понимать их надо буквально наооборот. smile


И народ, давайте чтоли уже поактивнее smile 
 

Это сообщение отредактировал(а) THandle - 28.3.2008, 12:11
PM   Вверх
SneG0K
Дата 28.3.2008, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 1
Всего: 54



Некий прикол с if..then

Если мы напишем 
Код

if true=true then

ТО это будет абсолютно аналогично
Код

if true then

Но не будет аналогично
Код

if true=false then
Вообщем если переменная должна равняться труе, то можно и не указывать труе))) Оно как бы там по стандарту)) Но если переменная будет равна фалсе, то надо приравнивать к фалсе)))
PM WWW Skype   Вверх
THandle
Дата 30.3.2008, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 1
Всего: 372



Цитата(SneG0K @  28.3.2008,  12:54 Найти цитируемый пост)
Некий прикол с if..then

Никакого прикола собсно и нету))

Вот еще одно:

Уничтожаем объект в своем же обработчике. Например:

Код

procedure Button1OnClick(Sender : TObject);
begin
  Button1.Free;
end;

PM   Вверх
SneG0K
Дата 31.3.2008, 15:13 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 1
Всего: 54



Приложение с параметрами

Все параметры, с которыми приложение было запущено содержатся в 

Код

ParamStr(index)
, где index указатель на текущий параметр. Например создай новое приложение и в обработчике формы OnCreate напиши
Код

Form1.Caption:=ParamStr(0);
Скомпилируй и сохрани на диск. Теперь создай bat-файл в той же папке где и скомпилированная программа и напиши в нем
Код

open Project1.exe hello world
И получиш ты ТОЛЬКО hello. world уже будет содержаться в 
Код

ParamStr(1);


Добавлено через 3 минуты и 41 секунду
Забыл сказать отсчет параметров начинается с 0, а не с 1. Но это не значит, что cmd.exe, php.exe, perl.exe и другие получает весь код в параметрах smile Они просто получают указатель на файл, в котором содержится код smile 
PM WWW Skype   Вверх
THandle
Дата 31.3.2008, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 1
Всего: 372



Цитата(SneG0K @  31.3.2008,  15:13 Найти цитируемый пост)
Приложение с параметрами

Все параметры, с которыми приложение было запущено содержатся в 

...


SneG0K, все это не относится к обсуждаемой теме, и описано в DRKB, а может даже и тут, где - нибудь в факе. Поищи поиском и наищешь искомое.



PM   Вверх
SneG0K
Дата 31.3.2008, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 1
Всего: 54



Цитата(THandle @  23.3.2008,  19:08 Найти цитируемый пост)
Циклы работы со строками начинай с нуля, а заканчивай длиной строки минус 1:

Обьясняю, в строках первый символ содержит длину всей строки. Поэтому правильная длинна строки будет length(строка)-1

Это сообщение отредактировал(а) SneG0K - 31.3.2008, 23:48
PM WWW Skype   Вверх
THandle
Дата 5.4.2008, 21:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 1
Всего: 372



Значит так, у Len ничего написать не получилось поэтому взялся я smile 


Вот вступление:



  Жил-был один человек, звали его допустим  Иван. Было ему от роду 16 годков. Жил он не бедно – не богато, учился в школе, на двойки. Одеваться любил он модно, был высокого роста и имел гладкие светлые волосы. Жил он себе припеваючи, играл в игры компьютерные, пиво пил с девчонками на дискотеках, в общем был Ваня самым обычным нормальным парнем. 
  Был у Ивана друг, крутой программист и хакер. Хвастался он перед Иванушкой нашим, хвастался. И как иконку в трей запуздырить показывал, и как программку в 30 килобайт забабахать. И говорил этот друг что все это братец, мол, Делфи, круто оно, возьмись, изучай.
  Задумался тут Иван. Будучи по натуре своей человеком любознательным решил он попробовать поучится работать с этой программой. Взял он у друга дистрибутив, установил и сидит, смотрит. Кнопочки какие-то, надписи не русские. Среди всего этого выделялась красивая кнопочка с изображенным зеленым треугольничком. Решил Иван – тыкну её, будь что будет. И тыкнул. Результат был ужасный -
появилось окошко, ну прям как у друга, надпись на нем – Form1, если мышом взять за верхушку – поползет, поползет – берегись - улетит! 
  Обрадовался наш герой, побыстрее выключил компьютер, побежал всем хвастаться что программу написал. И решил с этого момента Ваня твердо – стать программистом, и дело с концом. Вернувшись вечером домой включил он компьютер, полез в Интернет, нашел там книжки по Делфи и стал усердно изучать их. 
  Далее поведаем мы вам сказ о том, какие трудности встали на пути Ивана, и как он их преодолел.

PM   Вверх
THandle
Дата 15.4.2008, 20:54 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 1
Всего: 372



Всё времени никак не хватает написать... думаю либо в конце этой, либо в начале следующей недели будет продолжение smile 

И на всякий случай, для некоторых, напоминаю, все советы приведенные тут, являются вредными, то есть понимать их нужно прямо наоборот. Например:


Цитата(THandle @  23.3.2008,  21:08 Найти цитируемый пост)


Циклы работы со строками начинай с нуля, а заканчивай длиной строки минус 1:

    
Код

var
  s : string;
  i : integer;
begin
  for i := 0 to Length(s) - 1 do
    s[i] := ...;
 end;



А циклы со списками начинай с 1 до List.Count:
    
Код

var
  List : TSomeList;
  i : integer;
begin
  for i := 1 to List.Count do
    List.Add(...);
end;



Надо понимать так:


Циклы работы со строками начинай с 1, а заканчивай длиной строки length(string).

Код

var
  s : string;
  i : integer;
begin
  for i := 1 to Length(s) do
    s[i] := ...;
 end;



А циклы работы со списками начинай с 0 и заканчивай List.Count - 1.

Код

var
  List : TSomeList;
  i : integer;
begin
  for i := 0 to List.Count - 1 do
    List.Add(...);
end;


PM   Вверх
THandle
Дата 23.4.2008, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 1
Всего: 372



Оказалась не легким делом писать все это. Но уже многое готово smile Скоро постараюсь выложить.

Вот еще одна ошибка, которая вызывает у новичков недоумение:

Почему компилятор ругается на безобидный цикл for?

Код


procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
begin
  for i := 0 to 5 do
    begin
      ShowMessage(IntToStr(i));
      i := 5;
    end;
end;


Ответ:
Да патамучта нильзя в цикле for менять значение переменной счетчика.


А вот и еще одно:

В таком цикле:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
  s : string;
begin
  s := 'Очень, ну очень длинный текст';
  for i := 1 to Length(s) do
    ShowMessage(s[i]);
end;



Будет очень много раз вызываться функция length, что сделает программу очень медленной.
На самом деле это не так. Начальное и конечное значение цикла for расчитывается только один раз, при начале его выполнения.

Поэтому выносить длину строки в отдельную переменную глупо:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
  s : string;
  len : integer;
begin
  s := 'Очень, ну очень длинный текст';
  len := length(s);
  for i := 1 to len do
    ShowMessage(s[i]);
end;


Поэтому стоит быть очень осторожным, когда в таком цикле удаляется часть строки, например:

Эта процедура по идее должна удалять пробелы:

Код

procedure delspace(var s:string);
var i:integer;
begin
  for i:=1 to length(s) do
    if s[i]=' ' then delete(s,i,1);
end;


Однако же все пробелы она не удалит как раз по причине единичного расчета значений цикла.

Подробнее об этом я писал тут:

http://forum.vingrad.ru/forum/topic-206543.html




Ну и ребят, кто тут бывает, поактивнее предлагайте "заблуждения". Проект не заброшен и заброшенным быть не собирается. smile 
PM   Вверх
SneG0K
  Дата 29.4.2008, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 1
Всего: 54



THandle ток не ругай меня smile 

 Так-с... Может нижеописанное и не относится к начинающим программистам, но это относится к начинающим WinSOCK'ерам. 
У меня с самого начала изучения дельфи как-то появилась мания использовать стринговые переменные, что иногда очень удобно, а иногда является источником всех бед. 
 Так вот, моя первая сетевая программа ничем необычным не отличалась, она просто передавала какие-либо данные от клиента, к серверу и обратно. Вообщем все просто. В качестве буфера я использовал стринговую переменную. И получал в неё данные как в буфер.

Код

var
 s:string;

....

 recv(sock, s, 256);
В итоге текст получался нечитаемым. 
Код

var
 s:array[0.255] of char;

....
 
 recv(sock, s, 256);
При замене на массив чаров текст нормализовался и стал читаемым... 
Но я не остановился и решил понять почему текст в стринговой переменной превращается в неизвестно что... Понять почему я так и не смог. Наверно кодировки тут сыграли свою роль. Или переменные... Вообщем неизвестно. Но 
Код

var
 s:string
....
 recv(sock, @s, 256);
Вообщем, указывать стринговую строку надо как указатель... 


Внимание! Это из дневника Грозного Ивана...
PM WWW Skype   Вверх
THandle
Дата 30.4.2008, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 1
Всего: 372



SneG0K, Иваном будешь? smile 

Твой пример вполне подойдет, если использовать его для объяснения работы со строками.
Если сможешь оформить в виде рассказика с объяснением что как и куда использовать - то буду очень радsmile

Вобщем список заблуждений сейчас такой:

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 до длины некоторой строки и удалении некоторых знаков из этой строки, удаляются не все знаки?


Вот. Пока 10 штук. Почти все уже готовы.
PM   Вверх
SneG0K
  Дата 30.4.2008, 23:25 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 1
Всего: 54



И заблуждение №11.
 11)Почему юзать Дельфи, а не что-то другое?

Ответ:Потомушто ДЕЛЬФИ РУЛИТ!!!! smile  smile  smile 

Ссори за  smile 
PM WWW Skype   Вверх
THandle
Дата 4.5.2008, 14:41 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 1
Всего: 372



Из записок Ивана:









                                                                                                                                      12 ноября.

   Решил вести дневник. Пусть будущее поколение знает как герои изучали Delphi.

Сегодня ознакомился с интерфейсом. Классная вещь вам скажу. Скачал учебник. Читаю.

                                                                                                                                      16 ноября.

  Прочитал учебник. Теперь мне многое понятно. Надо написать какую-нибудь программку. И я даже знаю какую...

                                                                                                                                      28 ноября.

  Узнал сегодня что со строками можно работать как с массивом. Я был ваще в шоке.
  Стал переделывать все. Чтоб круче было. И возникла одна маленькая проблемка:
  
Код

var 
   s : string; 
   i : integer;
begin  
  for i := 0 to Length(s) - 1 do
    s[i] := 'Э';
end; 


Почему-то код вызывает ошибку:( почему не понимаю. Видимо из за глюков в Delphi. Вообще если так вот посмотреть с проффесианальной точки зрения ошибок очень много.
Абсолютно непонятно чем не понравился мой код этому компелятору? Ведь строка же это массив символов, который наченается с нуля. Последним элементом является длина этого массива вычисляемая очень полезной функцией Length, которую я случайно обнаружил и благодаря опытам установил что она возвращает длину строки.
  Ладно, не будем работать со строками как с массивом, раз они не хотят...


                                                                                                                                     8 декабря.

  Случайно прочитал сегодня где-то в интернете, что строка начинается с 1, а в нулевом элементе хранится её длина. А заканчивается строка её длиной(странно по моему, ну пусть будет так, раз по другому не смогли сделать). Переделал свой код. И правда работает. Как я сам не догадался?

Код

Var
  s : string;
  i : integer;
begin
  for i := 1 to Length(s) do
    s[i] := 'Э';
end; 



                                                                                                                                      11 декабря.

  Обнаружил сегодня интересный класс: Tstringlist. Очень полезная вещь для работы с файлами. 

                                                                                                                                      14 декабря.

  Класс оказался неправильный какой-то. Не работает:(
  Представляете, запустил в цикле добавление всех строк из моего StringList'а в Memo, а получилось так что первый элемент он игнорирует, а потом еще и ошибку выбрасывает:(

Код

var
  List : TStringList;
  i : integer;
begin
  List := TstringList.Create;
  List.LoadFromFile('C:\\MySuperPuperProgram\MainVirus.txt');
  for i := 1 to List.Count do
    Memo1.Lines.Add(List.Strings[i]);
end; 



Очень подозрительно, согласитесь?
                        
                                                                                                                                      19 декабря.

Да уж. Предыдущий опыт со строками должен был научить меня тому что в Delphi и в программировании вообще(я же теперь еще и Assembler отлично знаю, пишу сайты на PHP и собираюсь браться за C++, чтобы разрабатывать 3Д-игры).
Оказывается что во всех таких классах нумерация элементов идет не как в строках, а с 0, а заканчивается, видите ли, числом Count — 1. Потому что начальное значение Count = 1, а начинается список элементов с 0. Интересно кто такое придумал? Повесить его надо. Не поянтности какие то делают. Ужас полный.

Вот в общем мой код. Прикиньте, работает:
Код


var
  List : TStringList;
  i : integer;
begin
  List := TstringList.Create;
  List.LoadFromFile('C:\\MySuperPuperProgram\MainVirus.txt');
  for i := 0 to List.Count - 1 do
    Memo1.Lines.Add(List.Strings[i]);
end; 


А вообще в одной хорошей сатейке в интернете, кстати на том же сайте на котором я узнал и про строки, нашел еще то что оказывается у класса TstringList есть такая процедура AddStrings(там было написано что это метод, но что такое метод я не знаю почему-то, хотя учебник прочитал). 

В общем он неслабо упрощает мою задачу:

Код

var
  List : TStringList;
begin
  List := TstringList.Create;
  List.LoadFromFile('C:\\MySuperPuperProgram\MainVirus.txt');
  Memo1.Lines.AddStrings(List.Strings);
end; 


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


                                                                                                                                18 января.

Ну вот, отлично отпраздновал новый год. Теперь вот вспомнил что у меня программа недописанная лежит. Решил сесть подумать что дальше делать. Полазил по нету. Удалось установить что к элементам списка строк можно обращаться прямо как массиву, а не через Strings. Объяснено это было тем что Strings объявлено с какой-то там директивой default. Ну да ладно. Пусть объявлено. Главное — работает. Мой прошлый код я модифицировал в вот что:

Код

var
  List : TStringList;
begin
  List := TstringList.Create;
  List.LoadFromFile('C:\\MySuperPuperProgram\MainVirus.txt');
  Memo1.Lines.AddStrings(List);
end; 



Работает супер.


                                                                                                                               20 января.

Где то прочитал что объекты надо уничтожать деструктором. Переделал свой код:

Код

procedure Button1Click(Sender : Tobject);
var
  List : TStringList;
begin
  List := TstringList.Create;
  List.LoadFromFile('C:\\MySuperPuperProgram\MainVirus.txt');
  Memo1.Lines.AddStrings(List);
  List.Destroy;
end; 


Почему-то при повторном нажатии на кнопку выскакивает ошибка:( Destroy убираю — всё нормально.
Статья видимо не правильная была.

                                                    
                                                                                                                                  26 января.

Прочитал где-то что нужно освобождать память за объектами не Destroy'м, а неким Free. Попробовал — ошибок нет, хотя результат тот же что и без него. Ну да ладно, пускай будет.

Вот мой новый код:

Код

procedure Button1Click(Sender : Tobject);
var
  List : TStringList;
begin
  List := TstringList.Create;
  List.LoadFromFile('C:\\MySuperPuperProgram\MainVirus.txt');
  Memo1.Lines.AddStrings(List);
  List.Free;
end; 




                                                                                                                                     29 января.

Сегодня абсолютно случайно обнаружил что у меня в программе можно и не использовать TstringList, так как в сам Memo можно точно так же загружать файл.

Теперь мой код выглядит так:

Код

procedure Button1Click(Sender : Tobject);
begin
  Memo1.Lines.LoadFromFile('C:\\MySuperPuperProgram\MainVirus.txt');
end; 


Это сообщение отредактировал(а) THandle - 11.6.2008, 14:54
PM   Вверх
THandle
Дата 4.5.2008, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 1
Всего: 372



Естественно в конце, после всего этого дневника Вани последует подробное объяснение чего не так и тд. smile 
PM   Вверх
Wedafl
Дата 24.5.2008, 03:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 12.5.2008
Где: Москва

Репутация: нет
Всего: нет



На тему конструктора, лично я часто пишу так
Код

var
  SomeClass : TSomeClass;
begin
  SomeClass := nil;
  try
    SomeClas := TSomeClass.Create;
    //что то делаем
  finally
    SomeClass.Free;
  end;
end;

И не понимаю чем это плохо.
PM MAIL ICQ   Вверх
THandle
Дата 26.5.2008, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 1
Всего: 372



Wedafl, обработку исключений конструктора лучше оставлять обработчику более высокого уровня, нежели try..finally..end;
PM   Вверх
Bose
Дата 4.6.2008, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 1
Всего: 51



Вот ещё совет-грабли, - уже раз n-дцать на них наступал. 
Надо к примеру нам подчистить какой-нибудь списочек. 
Пример покажу на TStringList. Предположим что нам нужно удалить пустые строки из файла.

Код

procedure Button1Click(Sender : Tobject);
var
  List : TStringList;
  i:integer;
begin
  List := TstringList.Create;
  try
    List.LoadFromFile('C:\\MySuperPuperProgram\MainVirus.txt');
    for i:=0 to List.Count-1 do
      if List[i]=EmptyStr then
        List[i].delete;
    // если в файле была хоть одна пустая строка, то дальше мы не пройдём
    List.SaveToFile('C:\\MySuperPuperProgram\MainVirus.txt');
  finally
    List.Free;
  end;
end; 



А вот ещё кстати частая ошибка
Код

procedure Button1Click(Sender : Tobject);
var
  List : TStrings;
  i:integer;
begin
  List := TStrings.Create;
  try
    List.LoadFromFile('C:\\MySuperPuperProgram\MainVirus.txt');
    for i:=List.Count-1 downto 0 do
      if List[i]=EmptyStr then
        List[i].delete; // а тут всё правильно написано
    List.SaveToFile('C:\\MySuperPuperProgram\MainVirus.txt');
  finally
    List.Free;
  end;
end; 


PM MAIL WWW Skype   Вверх
THandle
  Дата 5.6.2008, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 1
Всего: 372



Bose, ну хоть кто-то наконец то что-то предложил smile 

Буду дописывать.  smile И кидайте новые идеи smile 

Это сообщение отредактировал(а) THandle - 5.6.2008, 08:54
PM   Вверх
Bose
Дата 5.6.2008, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 1
Всего: 51



Этот пример получился слишком замороченный, но у меня не раз возникали такие проблемы:

Предположим, что Иван узнал что формы можно создавать динамически, и даже стал использовать оператор assign. 
Дано:
Все переменные форм объявлены как глобальные(по умолчанию дельфи так и делает).
Код

unit Form1;

interface

uses 
  classes,forms, 
  ... 

type
   TForm1=class(TForm)
       ...
   end;

var
  Form1:TForm;

implementation
....


При создании форм Иван проверяет, не была ли эта форма уже создана. 
Пример
Код

procedure ShowForm1;
begin
  if not assigned(Form1) then
    Form1:=TForm1.Create(Application);
  Form1.ShowModal;
  Form1.Free;
end;


А потом Иван узнал что глобальные переменные - это зло и решил сделать все глобальные переменные локальными:
Код

procedure ShowForm1;
var
  Form1:TForm;
begin
  if not assigned(Form1) then
    Form1:=TForm1.Create(Application);
  Form1.ShowModal;
  Form1.Free;
end;

И стал получать Access Violation, ибо неициализированные локальные переменные, не равны nil, так что условие not assigned(Form1) никогда не срабатывает.

Добавлено @ 14:09
А вот ещё вредный совет, на этот раз ООП-шный:

Код

type
  TMyComponent=class(TComponent)
     destructor Destroy;
  end;


Если мы перегружаем какой-либо метод в наследнике, не в коем случае не используем директиву override  smile 

Это сообщение отредактировал(а) Bose - 5.6.2008, 14:10
PM MAIL WWW Skype   Вверх
THandle
Дата 10.6.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 1
Всего: 372



Цитата(Bose @  4.6.2008,  18:13 Найти цитируемый пост)


Код

procedure Button1Click(Sender : Tobject);
var
  List : TStringList;
  i:integer;
begin
  List := TstringList.Create;
  try
    List.LoadFromFile('C:\\MySuperPuperProgram\MainVirus.txt');
    for i:=0 to List.Count-1 do
      if List[i]=EmptyStr then
        List[i].delete;
    // если в файле была хоть одна пустая строка, то дальше мы не пройдём
    List.SaveToFile('C:\\MySuperPuperProgram\MainVirus.txt');
  finally
    List.Free;
  end;
end; 



А вот ещё кстати частая ошибка
    
Код

procedure Button1Click(Sender : Tobject);
var
  List : TStrings;
  i:integer;
begin
  List := TStrings.Create;
  try
    List.LoadFromFile('C:\\MySuperPuperProgram\MainVirus.txt');
    for i:=List.Count-1 downto 0 do
      if List[i]=EmptyStr then
        List[i].delete; // а тут всё правильно написано
    List.SaveToFile('C:\\MySuperPuperProgram\MainVirus.txt');
  finally
    List.Free;
  end;
end;
 



Это то же самое что и со строками, загоню в один "раздел" их smile 

Про строки я имел ввиду вот это:

Цитата(THandle @  23.4.2008,  21:23 Найти цитируемый пост)
Поэтому стоит быть очень осторожным, когда в таком цикле удаляется часть строки, например:

Эта процедура по идее должна удалять пробелы:

    
Код

procedure delspace(var s:string);
var i:integer;
begin
  for i:=1 to length(s) do
    if s[i]=' ' then delete(s,i,1);
end;



Однако же все пробелы она не удалит как раз по причине единичного расчета значений цикла.

Подробнее об этом я писал тут:

http://forum.vingrad.ru/forum/topic-206543.html



Цитата(Bose @  5.6.2008,  15:05 Найти цитируемый пост)
И стал получать Access Violation, ибо неициализированные локальные переменные, не равны nil, так что условие not assigned(Form1) никогда не срабатывает.


Хороший пример smile 


Цитата(Bose @  5.6.2008,  15:05 Найти цитируемый пост)

Если мы перегружаем какой-либо метод в наследнике, не в коем случае не используем директиву override  smile 


Ага smile  Тоже добавлю.


Вообще постараюсь по-чуть чуть писать, но так как времени не много то быстро не получится smile

А вы пока предлагайте новые идеи. Надо хотя бы не меньше 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 в перекрытом методе в наследнике какого-то класса.



Буду постепенно писать.

Всем удачи!!!

PM   Вверх
Bose
Дата 11.6.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 1
Всего: 51



Корректура:

Цитата(THandle @  4.5.2008,  14:41 Найти цитируемый пост)
 8 декабря.  Случайно прочитал сегодня где-то в интернете, что строка начинается с 1, а в нулевом элементе хранится её длина. А заканчивается строка её длиной(странно по моему, ну пусть будет так, раз по другому не смогли сделать). Переделал свой код. И правда работает. Как я сам не догадался?


THandle, дальше код идёт, и там тоже i с 0 по length-1. Опечатка по ходу =)
PM MAIL WWW Skype   Вверх
THandle
Дата 11.6.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 1
Всего: 372



Цитата(Bose @  11.6.2008,  13:59 Найти цитируемый пост)
THandle, дальше код идёт, и там тоже i с 0 по length-1. Опечатка по ходу =) 

Ага smile  Спс smile 
PM   Вверх
THandle
Дата 25.10.2008, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 1
Всего: 372



Решил в свободное время возобновить работу над проектом.
Если есть еще предложения - пишите.
PM   Вверх
bems
Дата 27.1.2009, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



Цитата(THandle @  4.5.2008,  14:41 Найти цитируемый пост)
в нулевом элементе хранится её длина
это ж только про шортстринги!

Добавлено через 8 минут и 8 секунд
Цитата(THandle @  23.4.2008,  20:23 Найти цитируемый пост)
Будет очень много раз вызываться функция length, что сделает программу очень медленной.
На самом деле это не так. Начальное и конечное значение цикла for расчитывается только один раз, при начале его выполнения.

на самом деле, даже если бы конечное значение и ращитывалось на каждой итерации, то ничего страшного все равно бы не случилось. Эта страшилка с длиной строки растет из сей, где для нахождения длины строки люди сканировали ее в поисках нуля. Это делало алгоритм квадратичным. А дельфовая функция length благополучно проверяет поле длины строки по отрицательному смещению от первого символа, поэтому ее можно использовать и в условиях для цикла while без присваивания переменной


--------------------
Обижено школьников: 8
PM MAIL   Вверх
roschinspb
Дата 18.2.2010, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 27.1.2010
Где: С-Пб

Репутация: нет
Всего: нет



На тему дэльфовых заблуждений:
Всегда надо делать так:
Код

Query.SQL.Clear;  // Это очень нужная строка
Query.SQL.Add('SELECT');
Queri.SQL.Add('Field1'); // Опс скопипастили из другого запроса. Ошибочка и компилятор не заметил, ибо нефиг
Query.SQL.Add('From');
Query.SQL.Add('Table1');


Ни в коем случае не так:
Код

Query.SQL.Text := 'SELECT'#13#10+
                'Field1'#13#10+
                'From'#13#10+
                'Table1';
 Так получилось слишком коротко, ни кто не заметит, что Вы много работали
PM MAIL WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Форум группы: Vingrad Delphi - Voluntary Writers Group | Следующая тема »


 




[ Время генерации скрипта: 0.1803 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.