Работа с компонентой Мемо

Тема в разделе "Delphi - Компоненты", создана пользователем Dake, 16 мар 2008.

  1. Dake

    Dake Гость

    Задание: в ручную вписывается список, допустим, каких-либо фруктов. Ширина поля должна меняться паралельно с вводом названий фруктов, названия фруктов вводятся в столбик. Конечная ширина равна максимальной длине названия. как это реализовать?
     
  2. zubr

    zubr Гость

    Код (Text):
    procedure CreateWidthSpis(const spis:TStringList; var memo:TMemo);
    var
    i:Integer;
    maxWidth:Integer;
    canvas:TCanvas;
    begin
    canvas:=TCanvas.Create;
    try
    canvas.Handle:=GetDC(memo.Handle);
    canvas.Font:=memo.Font;
    maxWidth:=0;
    For i:=0 to spis.Count-1 do
    begin
    If canvas.TextWidth(spis.Strings[i])>maxWidth then
    maxWidth:=canvas.TextWidth(spis.Strings[i]);
    end;
    finally
    canvas.Free;
    end;
    memo.ClientWidth:=maxWidth+5;
    memo.Lines.Assign(spis);
    end;
     
  3. Dake

    Dake Гость

    использовать написанное не могу, можно весь код программы с небольшими хотя бы комментами, плз...
     
  4. zubr

    zubr Гость

    Ну хоть чуть чуть, надо и самому мозги включать.
    Код (Text):
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;

    type
    TForm1 = class(TForm)
    Memo1: TMemo;
    procedure Memo1KeyPress(Sender: TObject; var Key: Char);
    procedure Memo1Change(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure CreateWidthSpis(const spis:TStringList; var memo:TMemo);
    var
    i:Integer;
    maxWidth:Integer;
    canvas:TCanvas;
    begin
    canvas:=TCanvas.Create;
    try
    canvas.Handle:=GetDC(memo.Handle);
    canvas.Font:=memo.Font;
    maxWidth:=0;
    For i:=0 to spis.Count-1 do
    begin
    If canvas.TextWidth(spis.Strings[i])>maxWidth then
    maxWidth:=canvas.TextWidth(spis.Strings[i]);
    end;
    finally
    canvas.Free;
    end;
    memo.ClientWidth:=maxWidth+5;
    //memo.Lines.Assign(spis);
    end;

    procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
    begin
    CreateWidthSpis(TStringList(Memo1.Lines), Memo1);
    end;

    procedure TForm1.Memo1Change(Sender: TObject);
    begin
    CreateWidthSpis(TStringList(Memo1.Lines), Memo1);
    end;

    end.
     
  5. zubr

    zubr Гость

    sax_ol
    Если ты заметил, в Сообщение #2 мною написана универсальная функция, где входной параметр - список TStringList, а выходной Memo с измененной шириной и загруженным списком входного параметра (к вопросу почему var memo).
    В сообщении #4 написана реализация с использованием данной универсальной функции (ну не охота для лентяев еще и оптимизировать код под конкретную задачу) - это к вопросу TStringList(Memo1.Lines) - компилятор просто Memo1.Lines (TStrings) не пропустит.
    Какие еще будут вопросы?
     
  6. zubr

    zubr Гость

    Ну если ты такой умный - помог бы человеку. А умным быть задним умом и критику наводить на несущественные детали - это мы все умеем.
     
  7. zubr

    zubr Гость

    1. Аргументы, пожалуйста. Желательно, на примерах, фактах, тестах доказательство, что программа с использованием параметров процедуры в том виде, как я предложил будет работать хуже, чем (const spis:TStrings; memo:TMemo);
    2. Как это влияет на работоспособность программы.
    Чем плохо помог? Код не рабочий? Работает не корректно? Аргументы, пожалуйста.
    Смотря когда и в каком виде критика наводится.
     
  8. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Уважаемые модераторы! Я, конечно, знаю что сейчас сам себе буду противоречить, но всё же не могли бы вы выяснять отношения между собой в пм? Мне кажеться Dake не найдет в ваших спорах ничего содержательного для себя. Заранее извиняюсь за флейм.
     
  9. zubr

    zubr Гость

    Общеизвестные истины ничем не проясняющие конкретный вопрос, впрочем, как я заметил, большинство твоих ответов в такой форме. Еще раз прошу конкретно указать в чем мой код хуже твоего - количество набранных букв (TStrings или TStringList) в качестве аргумента не принимается.
    Если бы ты сам правильный код по данному вопросу написал, а я со своим кривым бы влез, или хотя бы ты доказал существенность моих ошибок... , а так смотри сообщение #8.
    Насчет неправильно - что неправильно еще раз? Передача параметра по ссылке что ли? И чем хуже передача параметра по ссылке, чем по значению в данном случае?
     
  10. zubr

    zubr Гость

    Мда...веский аргумент. Теперь по сути вопроса. Рассмотрим 2 варианта параметров:
    1. Мой, кривой.
    (const spis:TStringList; var memo:TMemo);
    2. Sax_ol правильный
    (const spis:TStrings; memo:TMemo);
    В моем случае для параметра spis приходится делать приведение типов TStringList(Memo1.Lines). Ладно согласен, на несколько буковок кода пришлось написать больше. Смотрим ассемблерный код, выдаваемый компилятором - полная индентичность для данного параметра.
    Теперь рассмотрим 2-й параметр var memo:TMemo и memo:TMemo. В первом случае параметр передается по ссылке, то есть указатель на указатель, во втором просто указатель. В первом случае программой на время жизни данной процедуры дополнительно выделяется 4 байта под ссылку - и весь криминал. Для прикладного программирования это совсем не существенно.
    Возникает вопрос, чем уж так кривы параметры процедуры моего варианта? По большому счету вопрос выеденного яйца не стоит.
     
  11. zubr

    zubr Гость

    sax_ol
    Блин, что ты прицепился к этой процедуре? Процедура была написана только для наглядности, а не для тиражирования. Я ж не написал библиотеку для дальнейшего применения. Код написанный за 5 минут, только чтобы показать принцип решения вопроса сабжа. В данном коде важно тело процедуры, а не ее параметры. Да возьми большинство учебников по программированию, там код разве оптимизированный, обсосанный со всех сторон выкладывается? В основном выкладывается код в виде более понятном для обсуждаемой темы. То что кто то его будет тупо копировать вместе с оболочкой - это его проблемы. Человек думающий воспользуется принципом решения вопроса, а не тупым копированием, ну а не думающему уже ничего не поможет.
    Заметь, тема называется Необходимо автоматизировать изменение ширины поля компоненты, а не Как правильно и красиво применять параметры в процедуре.
     
Загрузка...
Похожие Темы - Работа компонентой Мемо
  1. Andrey Kha
    Ответов:
    0
    Просмотров:
    20
  2. Hoasker
    Ответов:
    0
    Просмотров:
    64
  3. garri671
    Ответов:
    0
    Просмотров:
    52
  4. lelik200969
    Ответов:
    0
    Просмотров:
    50
  5. Kozolick
    Ответов:
    0
    Просмотров:
    136

Поделиться этой страницей