Версия для печати темы
Форум программистов _ 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)
А накой такие пляски?

Собственно и
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 в параметр, и ничего оптимизировать, ненадо, кстати и писать меньше, и более "универсальнее"

.
А к вопросу универсальности, так и это все нафик надо, передали мемо, а в нем уже есть все, юзай и радуйся. И вообще вся это "универсальность" - ботва.
Автор: 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® Ну во первых модераторы тоже люди

Во вторых никто и не выясняет отношения, по крайней мере с моей стороны вопросы были по ветке.
И к тому же, мне не видится наше обсуждение бесполезным для
Dake, по крайней мере оно должно подвигнуть его на выяснение этих вопросов, может он таки почитает чтолибо по этому поводу. А это уже не плохо.
Автор: 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 
Цитата
Возникает вопрос, чем уж так кривы параметры процедуры моего варианта? По большому счету вопрос выеденного яйца не стоит.
Очень напоминает - "что воля что неволя - все одно" (с) Сказка, не помню какая.
Вы вот все-таки нехотите слушать, уперлись рогом в тики. Дело не только в количестве асемблерных инструкций.
Возмем к примеру стороннюю библиотеку, неважно кто ее написал, хоть вася пупкин за соседним компом.
Там есть некая процедура где в параметрах есть все эти прелести. Что глядя на нее потенциальный пользователь будет понимать?
Вот про это и речь. Теперь допустим топикстартер (или еще кто) внял ваши высказывания за чистую монету, и давай кругом это впихивать (разницы то нет).
Я бы (думаю и не только) когда-нибудь, но спросили бы у него - "а что за ботву он курит", и каков был бы ответ?
Так вот по моему, тут "яйцо" есть. Уж незнаю смог ли сейчас вам донести мысь, - но страрался.

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)