Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

строки и mem'ы

44K
04 июля 2010 года
FeelUs
57 / / 10.05.2010
отладочные процедуры:
Код:
procedure dbgs(s:string);
  BEGIN
  form1.MemoDBG.Lines.Add(s);
  END;
procedure dbgn(n:longint);
  BEGIN
  form1.MemoDBG.Lines.Add(inttostr(n));
  END;
procedure dbgm(s:Tstrings);
  var i:word;
  BEGIN
  form1.MemoDBG.Lines.Add('memo#');
  for i:=0 to s.Count-1
  do  form1.MemoDBG.Lines.Add(inttostr(i)+'#'+s.strings+'#');
  END;

ВОПРОС: почему №1 и №2 в memoDBG выводят разные значения?
и как с этим бороться?


 
Код:
sub:=memonew.Lines;            dbgs('sub=');dbgm(sub);    //№1    
slovtoNew(i);                  dbgs('sub=');dbgm(sub);    //№2

где

sub:Tstrings;//я знаю, что лучше писать TstringList, но поскольку все lines
у mem'ов типа Tstrings, для большей совместимости Tstrings
a slovtoNew(i); изменяет memonew.lines

PS: чем отличается lines от lines.strings?
6
04 июля 2010 года
George
4.1K / / 05.01.2007
Sub - объектный указатель на memonew.lines типа TStrings. Изменяя memonew.lines, в Sub будут видны изменения, так как Sub - не отдельный объект, а лишь, как я уже сказал, указатель. Бороться можно вроде только если создать новый объект Sub := TStringList.Create(nil) и скопировать в него строки из memonew.Lines.
Lines от Lines.Strings ничем не отличается - это довольно свежая фича, для повышения удобочитаемости.

Зы. Почитайте стандарты оформления кода Дельфи - Ваш код весьма уныл.
44K
04 июля 2010 года
FeelUs
57 / / 10.05.2010
спасибо, заработало, правда не сразу обратил внимание на
Цитата: George
и скопировать в него строки



Цитата:
Ваш код весьма уныл


а что Вам конкретно не понравилось в моем коде, я нашел только:
- большие BEGIN и END, но я их делаю большими только в начале и в конце процедур и функций - для отделения описаний от кода
- пробелы после двоеточий не ставлю - виноват
- memoDBG и три отладочных функции можно было бы объявить как новый класс, но я совсем недавно пересел с паскаля на делфи и в ООП еще не силен

6
04 июля 2010 года
George
4.1K / / 05.01.2007
Да дело не в этом. На дельфикингдоме есть статья по стандартам стилевого оформления кода дельфи - рекомендую. Даже у нас где то на форуме ссылка валяется - в прикрепленных темах вроде смотреть надо. Сразу видно, что неправильно делаете отступы, оператор do зачем то не в одной строке с for, большие БЕГИН и ЕНД, ага, пробелы тоже.
416
05 июля 2010 года
MaitreDesir
380 / / 02.01.2008
Пример более-менее правильного и читаемого оформления:
Код:
procedure dbgs(s : string);
begin
  form1.MemoDBG.Lines.Add(s);
end;

procedure dbgn(n : longint);
begin
  form1.MemoDBG.Lines.Add(inttostr(n));
end;

procedure dbgm(s : Tstrings);
var
  i : word;
begin
  form1.MemoDBG.Lines.Add('memo#');
  for i := 0 to s.Count - 1 do  
    form1.MemoDBG.Lines.Add(inttostr(i) + '#' + s.strings + '#');
end;

...

  sub := memonew.Lines;            
  dbgs('sub=');
  dbgm(sub);    //№1    

  slovtoNew(i);                  
  dbgs('sub=');
  dbgm(sub);    //№2
339
05 июля 2010 года
verybadbug
619 / / 12.09.2005
Цитата: FeelUs
я знаю, что лучше писать TstringList, но поскольку все lines
у mem'ов типа Tstrings, для большей совместимости Tstrings



TStrings - абстрактный класс
TStringList = class(TStrings) - потомок TStrings, в котором реализован функционал для работы со строками


несмотря на то, что TMemo.Lines: TStrings,
создаются они всё-равно так Lines := TStringList.Create;

14
05 июля 2010 года
Phodopus
3.3K / / 19.06.2008
Цитата: verybadbug

несмотря на то, что TMemo.Lines: TStrings,
создаются они всё-равно так Lines := TStringList.Create;


в stdctrls мы можем видеть что это не так:

 
Код:
FLines := TMemoStrings.Create;

оно и логично, они виртуальные
5
05 июля 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: verybadbug

создаются они всё-равно так Lines := TStringList.Create;


Готов поспорить что в сэттере свойства Lines происходит копирование содержимого свежесозданного TStringList-а во внутреннюю коллекцию строк (FLines). ;)

339
06 июля 2010 года
verybadbug
619 / / 12.09.2005
Цитата: Phodopus
в stdctrls мы можем видеть что это не так:


[QUOTE=hardcase]Готов поспорить что в сэттере свойства Lines происходит копирование содержимого свежесозданного TStringList-а во внутреннюю коллекцию строк (FLines)[/QUOTE]

суть не в том, чтобы дать выкладки из исходников borland, а показать, что декларировать переменную мы можем как абстрактный класс (и работать с ней в соответствии с этим классом - свойства, методы), а создавать ее, как наследника этого класса (абстрактного)

 
Код:
var
  S1, S2: TStrings;
begin
  S1 := TStringListCreate;
  S2 := TMemoStrings.Create;


при этом мы можем использовать один и тот-же код для обработки переменных разных классов (главное, чтобы они были наследниками одного класса, свойства и методы которого мы используем)
Код:
var
  MyInt: Integer;

//сохранение свойств в поток
procedure SaveToStream(Stream: TStream);
begin
  Stream.Write(MyInt, SizeOf(MyInt));
end;

//сохранение свойств в файл
procedure SaveToFile(FileName: TFileName);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmCreate);
  try
    SaveToStream(Stream);
  finally
    Stream.Free;
  end;
end;


если меняется количество или тип свойств - меняем первую процедуру, и обе валидно работают
14
06 июля 2010 года
Phodopus
3.3K / / 19.06.2008
Цитата: verybadbug
суть не в том, чтобы дать выкладки из исходников borland


ну а как еще ответить на утверждение

Цитата: verybadbug

создаются они всё-равно так Lines := TStringList.Create;


?
или я чего-то не понял :)

Цитата: verybadbug
а показать, что декларировать переменную мы можем как абстрактный класс (и работать с ней в соответствии с этим классом - свойства, методы), а создавать ее, как наследника этого класса (абстрактного)

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


так оно и понятно, полиморфизм in action

62K
30 июля 2010 года
glonnawancy
5 / / 14.07.2010
столкнулся тут с проблемой что у меня при открытие файла выходит ошибка - что мол в 1027 строке ошибка. я могу его открыть на нетбуке. только вопрос кто знает как включить отображения номера строки кода. вроде уже все пролез - найти не могу
спасибо сем за внимание =
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог