Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум программистов _ Delphi - Компоненты _ Работа с компонентой Мемо

Автор: Dake 16:03:2008, 16:31

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

Автор: zubr 17:03:2008, 08:29

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;

Автор: Dake 19:03:2008, 17:35

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

Автор: zubr 20:03:2008, 09:13

Ну хоть чуть чуть, надо и самому мозги включать.

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.

Автор: sax_ol 20:03:2008, 09:40

Цитата(zubr @ 20:03:2008 - 12:13) *
TStringList(Memo1.Lines)

А накой такие пляски? wink.gif

Собственно и var memo:TMemo непонятно зачем ...

Автор: zubr 20:03:2008, 10:30

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

Автор: sax_ol 20:03:2008, 11:00

Цитата(zubr @ 20:03:2008 - 13:30) *
Какие еще будут вопросы?

Ага, нафига такие "универсальные" процедуры (кстати говоря, а не функция), для чего var, при чем тут компилятор?
Ничего похожего на создание/редактирования Memo в Сообщение #2 (да и в #4 тоже) замечено небыло. Чтобы менять свойства объекта/контрола/компонента - var и близко не нужен. Это про var.
А к вопросу про TStringList, просто TStrings в параметр, и ничего оптимизировать, ненадо, кстати и писать меньше, и более "универсальнее" smile.gif .

А к вопросу универсальности, так и это все нафик надо, передали мемо, а в нем уже есть все, юзай и радуйся. И вообще вся это "универсальность" - ботва. smile.gif

Автор: zubr 20:03:2008, 15:45

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

Автор: sax_ol 20:03:2008, 16:07

Я тоже умею красиво - лучше вообще не помогать, чем помогать плохо, а? И еще красиво - надо уметь воспринимать конструктивную критику.
А вот про "несущественные" - это еще вопрос!
----
Эх вы, я к вам так, а вы вот как, ну ладно.
А вот по поводу сабжа - мой совет: пересмотреть подход, что то там неправильно ....

Автор: zubr 20:03:2008, 17:35

Цитата
А вот про "несущественные" - это еще вопрос!

1. Аргументы, пожалуйста. Желательно, на примерах, фактах, тестах доказательство, что программа с использованием параметров процедуры в том виде, как я предложил будет работать хуже, чем (const spis:TStrings; memo:TMemo);
2. Как это влияет на работоспособность программы.
Цитата
Я тоже умею красиво - лучше вообще не помогать, чем помогать плохо, а?

Чем плохо помог? Код не рабочий? Работает не корректно? Аргументы, пожалуйста.
Цитата
И еще красиво - надо уметь воспринимать конструктивную критику.

Смотря когда и в каком виде критика наводится.

Автор: sax_ol 20:03:2008, 18:43

Цитата(zubr @ 20:03:2008 - 20:35) *
Аргументы, пожалуйста
Вы вот расскажите, а зачем вообще придумана вся эта неразбериха с передачей параметров, вообще ООП и полиморфизм в частности ну и т.д.?
Зачем люди пишут всякие VCL, со всякими var'ами, абстракциями, виртуальностью и т.п.? А другие виш еще и свои библиотеки наструячивают, тоже, куда ни глянь этого добра достаточно.
Раньше же без всего этого жили и ниче, все работало, а теперь вот приходиться заморачиваться с этим всем ...

Существенность не всегда выражается в "тиках", да и не сразу может проявиться, + еще оптимизация.

Цитата(zubr @ 20:03:2008 - 20:35) *
Смотря когда и в каком виде критика наводится.
Т.е. данный форум не место или как? И про какой вид речь? Как мне стоило бы это сделать, чтобы вы все нормально поняли?
Не язвил, не говорил, что вы лох и т.п. вполне доброжелательно. Или все-же?

Цитата(zubr @ 20:03:2008 - 20:35) *
Чем плохо помог? Код не рабочий? Работает не корректно?
Дело не в этом, если помогать, то стараться показывать - как делать правильно, а неправильно они и сами умеют.
Если я к примеру пишу код, то стараюсь его выверить, "чтоб комар носа не подточил", правда не всегда этого можно достигнуть, ну не мне рассказывать про невминяемых заказчиков, сроков, неправильной архитектуре и т.д.
Но помогать (тут как учить) надо на правильных примерах, и правильность (чистота, красивость, ... как угодно назовите) кода к этому тоже относится.

Автор: Vadik(R) 20:03:2008, 19:20

Уважаемые модераторы! Я, конечно, знаю что сейчас сам себе буду противоречить, но всё же не могли бы вы выяснять отношения между собой в пм? Мне кажеться Dake не найдет в ваших спорах ничего содержательного для себя. Заранее извиняюсь за флейм.

Автор: zubr 20:03:2008, 19:57

Цитата
Вы вот расскажите, а зачем вообще придумана вся эта неразбериха с передачей параметров, вообще ООП и полиморфизм в частности ну и т.д.?
Зачем люди пишут всякие VCL, со всякими var'ами, абстракциями, виртуальностью и т.п.? А другие виш еще и свои библиотеки наструячивают, тоже, куда ни глянь этого добра достаточно.
Раньше же без всего этого жили и ниче, все работало, а теперь вот приходиться заморачиваться с этим всем ...

Существенность не всегда выражается в "тиках", да и не сразу может проявиться, + еще оптимизация.

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

Если бы ты сам правильный код по данному вопросу написал, а я со своим кривым бы влез, или хотя бы ты доказал существенность моих ошибок... , а так смотри сообщение #8.
Цитата
Дело не в этом, если помогать, то стараться показывать - как делать правильно, а неправильно они и сами умеют.
Если я к примеру пишу код, то стараюсь его выверить, "чтоб комар носа не подточил", правда не всегда этого можно достигнуть, ну не мне рассказывать про невминяемых заказчиков, сроков, неправильной архитектуре и т.д.

Насчет неправильно - что неправильно еще раз? Передача параметра по ссылке что ли? И чем хуже передача параметра по ссылке, чем по значению в данном случае?

Автор: sax_ol 21:03:2008, 07:01

zubr

Цитата
как я заметил, большинство твоих ответов в такой форме.

Вот еще один - RTFM

Vadik®
Ну во первых модераторы тоже люди smile.gif
Во вторых никто и не выясняет отношения, по крайней мере с моей стороны вопросы были по ветке.
И к тому же, мне не видится наше обсуждение бесполезным для Dake, по крайней мере оно должно подвигнуть его на выяснение этих вопросов, может он таки почитает чтолибо по этому поводу. А это уже не плохо. wink.gif

Автор: zubr 21:03:2008, 10:50

Цитата
Вот еще один - RTFM

Мда...веский аргумент. Теперь по сути вопроса. Рассмотрим 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 байта под ссылку - и весь криминал. Для прикладного программирования это совсем не существенно.
Возникает вопрос, чем уж так кривы параметры процедуры моего варианта? По большому счету вопрос выеденного яйца не стоит.

Автор: sax_ol 21:03:2008, 12:44

zubr
1. Я вам даже больше скажу, const (в параметрах) - по большому счету - привинтимная мера, т.е. "чтоб даже и не думали", поэтому там разницы и не найдете.
2. Не надо мне приписывать. см #7 smile.gif

Цитата
Возникает вопрос, чем уж так кривы параметры процедуры моего варианта? По большому счету вопрос выеденного яйца не стоит.
Очень напоминает - "что воля что неволя - все одно" (с) Сказка, не помню какая.
Вы вот все-таки нехотите слушать, уперлись рогом в тики. Дело не только в количестве асемблерных инструкций.
Возмем к примеру стороннюю библиотеку, неважно кто ее написал, хоть вася пупкин за соседним компом.
Там есть некая процедура где в параметрах есть все эти прелести. Что глядя на нее потенциальный пользователь будет понимать?
Вот про это и речь. Теперь допустим топикстартер (или еще кто) внял ваши высказывания за чистую монету, и давай кругом это впихивать (разницы то нет).
Я бы (думаю и не только) когда-нибудь, но спросили бы у него - "а что за ботву он курит", и каков был бы ответ?
Так вот по моему, тут "яйцо" есть. Уж незнаю смог ли сейчас вам донести мысь, - но страрался. smile.gif

PS: Кстати а вот если разницы нет (ну или "выеденного яйца не стоит"), то по каким соображениям вы все-таки поставили, ну хотябы, var?

Автор: zubr 21:03:2008, 15:57

sax_ol
Блин, что ты прицепился к этой процедуре? Процедура была написана только для наглядности, а не для тиражирования. Я ж не написал библиотеку для дальнейшего применения. Код написанный за 5 минут, только чтобы показать принцип решения вопроса сабжа. В данном коде важно тело процедуры, а не ее параметры. Да возьми большинство учебников по программированию, там код разве оптимизированный, обсосанный со всех сторон выкладывается? В основном выкладывается код в виде более понятном для обсуждаемой темы. То что кто то его будет тупо копировать вместе с оболочкой - это его проблемы. Человек думающий воспользуется принципом решения вопроса, а не тупым копированием, ну а не думающему уже ничего не поможет.
Заметь, тема называется Необходимо автоматизировать изменение ширины поля компоненты, а не Как правильно и красиво применять параметры в процедуре.

Автор: sax_ol 21:03:2008, 16:13

Цитата(zubr @ 21:03:2008 - 18:57) *
Да возьми большинство учебников по программированию ... В основном выкладывается код в виде более понятном для обсуждаемой темы.

Да да в ]]>http://forum.codeby.net/go.php?http://delphimaster.ru/cgi-bin/forum.pl?id=1205857837&n=3]]>, на сим и закончим (я пас) ...

Эх движек не берет такие ссылки, надо руками ...

Форум Invision Power Board (http://nulled.ws)
© Invision Power Services (http://nulled.ws)