11 мая 2011 г.

Задачка №10

Объяснить это поведение кода.

procedure TForm1.Button1Click(Sender: TObject);
var
  S: String;
begin
  // Это обычное TMemo на форме
  Memo1.Text := '1.jpg'#13#10 +
                '2.jpg'#13#10 +
                '3.jpg'; 

  // И сам вопрос:
  S := Memo1.Lines[0]; // Здесь: S = '1.'  - ??? (вместо '1.jpg')
end;
Нет никаких других потоков, стороннего вмешательства. Весь активный код - только в этих строчках. Не баг Delphi или системы. Версия Delphi значения не имеет. Вопрос на знание VCL.

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

Ответ.

13 комментариев :

  1. Delphi 2010
    Задача не воспроизводится, S = '1.jpg' :(

    ОтветитьУдалить
  2. :D

    Разумеется "просто так" она не воспроизводится. Если бы она воспроизводилась - понять, что происходит, было бы делом 5 минут в отладчике.

    В этом и состоит задача.

    ОтветитьУдалить
  3. Разделителем строк указана точка?

    ОтветитьУдалить
  4. >>> Разделителем строк указана точка?

    Нет. Если бы это было так, точка не попала бы в строку.

    ОтветитьУдалить
  5. Перенос строк в TMemo может зависеть от ширины компонента.
    При свойствах по умолчанию и ширине Memo1 в 18 пикселей у меня получился описанный эффект.

    ОтветитьУдалить
  6. Ну свойство WordWrap (дословно "перенос слов") отвечает за это дело.

    Переносит строки по ширине
    Делаем узкий TMemo и перенос пойдет автоматом
    Получим столько символов в S, сколько влезет по ширине в строку
    Ставим WordWrap в false и получаем S='1.jpg'

    ОтветитьУдалить
  7. Предупреждать надо, что еще какие-то условия есть... а то я уже озадачился, как же такое может произойти. Соглашусь по поводу wordwrap.

    ОтветитьУдалить
  8. Может, мне надо было прямо сказать, что WordWrap = True? :D

    Ведь это default!

    Да, получилась бы очень сложная задача - догадаться, что размер Memo надо уменьшить :)

    ОтветитьУдалить
  9. это что, реально задача, или просто прикол такой, на тест трезвости после праздников?

    ОтветитьУдалить
  10. Да вас не поймёшь, в какую сторону тянуть надо...

    ОтветитьУдалить
  11. >>> Перенос строк в TMemo может зависеть от ширины компонента.
    что, простите? Размер компонента влияет на содержимое??

    Уважаемый Torbins очевидно имел в виду, что
    LineBreak = 'jpg'
    или любой другой, начинающийся с 'jpg'

    ОтветитьУдалить
  12. >>>что, простите? Размер компонента влияет на содержимое??
    При Memo1.WordWrap:=true влияет!

    ОтветитьУдалить
  13. Эх... хотел ответить, почитал комменты, а тут уже ответили... Ну тогда дополню чтоль.
    При TMemo.WordWrap=True компонент при чтении из TMemo.Lines[index] возвращает именно текст строки которая визуально отображается в TMemo. Это реализована в TMemoStrings в исходниках VCL. Сами же данные при этом TMemo не меняет, и получить все эти данные в неизменном виде можно через TMemo.Text

    p.s. Авторы компонента даже свойство назвали Lines, а не Strings как в TStringList, пытаясь подчеркнуть особенность поведения.

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и (опционально) ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.

Примечание. Отправлять комментарии могут только участники этого блога.