Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
|
16:03:2008, 16:31
|
|
Новенький ![]() Группа: Программист Сообщений: 2 Регистрация: 16:03:2008 Пользователь №: 15 916 Специализация: Защита Безопасность Информации Репутация: 0
|
Задание: в ручную вписывается список, допустим, каких-либо фруктов. Ширина поля должна меняться паралельно с вводом названий фруктов, названия фруктов вводятся в столбик. Конечная ширина равна максимальной длине названия. как это реализовать?
|
|
Сообщение
#1
|
|
![]() |
|
|
17:03:2008, 08:29
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 904 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 11
|
Код 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; |
|
Сообщение
#2
|
|
|
|
19:03:2008, 17:35
|
|
Новенький ![]() Группа: Программист Сообщений: 2 Регистрация: 16:03:2008 Пользователь №: 15 916 Специализация: Защита Безопасность Информации Репутация: 0
|
использовать написанное не могу, можно весь код программы с небольшими хотя бы комментами, плз...
|
|
Сообщение
#3
|
|
|
|
20:03:2008, 09:13
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 904 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 11
|
Ну хоть чуть чуть, надо и самому мозги включать.
Код 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. |
|
Сообщение
#4
|
|
|
|
20:03:2008, 09:40
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 878 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 28
|
|
|
Сообщение
#5
|
|
|
|
20:03:2008, 10:30
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 904 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 11
|
sax_ol
Если ты заметил, в Сообщение #2 мною написана универсальная функция, где входной параметр - список TStringList, а выходной Memo с измененной шириной и загруженным списком входного параметра (к вопросу почему var memo). В сообщении #4 написана реализация с использованием данной универсальной функции (ну не охота для лентяев еще и оптимизировать код под конкретную задачу) - это к вопросу TStringList(Memo1.Lines) - компилятор просто Memo1.Lines (TStrings) не пропустит. Какие еще будут вопросы? |
|
Сообщение
#6
|
|
|
|
20:03:2008, 11:00
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 878 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 28
|
Какие еще будут вопросы? Ага, нафига такие "универсальные" процедуры (кстати говоря, а не функция), для чего var, при чем тут компилятор? Ничего похожего на создание/редактирования Memo в Сообщение #2 (да и в #4 тоже) замечено небыло. Чтобы менять свойства объекта/контрола/компонента - var и близко не нужен. Это про var. А к вопросу про TStringList, просто TStrings в параметр, и ничего оптимизировать, ненадо, кстати и писать меньше, и более "универсальнее" А к вопросу универсальности, так и это все нафик надо, передали мемо, а в нем уже есть все, юзай и радуйся. И вообще вся это "универсальность" - ботва. |
|
Сообщение
#7
|
|
|
|
20:03:2008, 15:45
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 904 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 11
|
Ну если ты такой умный - помог бы человеку. А умным быть задним умом и критику наводить на несущественные детали - это мы все умеем.
|
|
Сообщение
#8
|
|
|
|
20:03:2008, 16:07
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 878 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 28
|
Я тоже умею красиво - лучше вообще не помогать, чем помогать плохо, а? И еще красиво - надо уметь воспринимать конструктивную критику.
А вот про "несущественные" - это еще вопрос! ---- Эх вы, я к вам так, а вы вот как, ну ладно. А вот по поводу сабжа - мой совет: пересмотреть подход, что то там неправильно .... |
|
Сообщение
#9
|
|
|
|
20:03:2008, 17:35
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 904 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 11
|
Цитата А вот про "несущественные" - это еще вопрос! 1. Аргументы, пожалуйста. Желательно, на примерах, фактах, тестах доказательство, что программа с использованием параметров процедуры в том виде, как я предложил будет работать хуже, чем (const spis:TStrings; memo:TMemo); 2. Как это влияет на работоспособность программы. Цитата Я тоже умею красиво - лучше вообще не помогать, чем помогать плохо, а? Чем плохо помог? Код не рабочий? Работает не корректно? Аргументы, пожалуйста. Цитата И еще красиво - надо уметь воспринимать конструктивную критику. Смотря когда и в каком виде критика наводится. |
|
Сообщение
#10
|
|
|
|
20:03:2008, 18:43
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 878 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 28
|
Аргументы, пожалуйста Вы вот расскажите, а зачем вообще придумана вся эта неразбериха с передачей параметров, вообще ООП и полиморфизм в частности ну и т.д.?Зачем люди пишут всякие VCL, со всякими var'ами, абстракциями, виртуальностью и т.п.? А другие виш еще и свои библиотеки наструячивают, тоже, куда ни глянь этого добра достаточно. Раньше же без всего этого жили и ниче, все работало, а теперь вот приходиться заморачиваться с этим всем ... Существенность не всегда выражается в "тиках", да и не сразу может проявиться, + еще оптимизация. Смотря когда и в каком виде критика наводится. Т.е. данный форум не место или как? И про какой вид речь? Как мне стоило бы это сделать, чтобы вы все нормально поняли?Не язвил, не говорил, что вы лох и т.п. вполне доброжелательно. Или все-же? Чем плохо помог? Код не рабочий? Работает не корректно? Дело не в этом, если помогать, то стараться показывать - как делать правильно, а неправильно они и сами умеют.Если я к примеру пишу код, то стараюсь его выверить, "чтоб комар носа не подточил", правда не всегда этого можно достигнуть, ну не мне рассказывать про невминяемых заказчиков, сроков, неправильной архитектуре и т.д. Но помогать (тут как учить) надо на правильных примерах, и правильность (чистота, красивость, ... как угодно назовите) кода к этому тоже относится. |
|
Сообщение
#11
|
|
|
|
20:03:2008, 19:20
|
|
Продвинутый ![]() ![]() Группа: Программист Сообщений: 142 Регистрация: 12:12:2007 Из: Волгоград Пользователь №: 14 203 Специализация: Программист, знаю HTML, JS, CSS, Паскаль. Репутация: 2
|
Уважаемые модераторы! Я, конечно, знаю что сейчас сам себе буду противоречить, но всё же не могли бы вы выяснять отношения между собой в пм? Мне кажеться Dake не найдет в ваших спорах ничего содержательного для себя. Заранее извиняюсь за флейм.
|
|
Сообщение
#12
|
|
|
|
20:03:2008, 19:57
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 904 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 11
|
Цитата Вы вот расскажите, а зачем вообще придумана вся эта неразбериха с передачей параметров, вообще ООП и полиморфизм в частности ну и т.д.? Зачем люди пишут всякие VCL, со всякими var'ами, абстракциями, виртуальностью и т.п.? А другие виш еще и свои библиотеки наструячивают, тоже, куда ни глянь этого добра достаточно. Раньше же без всего этого жили и ниче, все работало, а теперь вот приходиться заморачиваться с этим всем ... Существенность не всегда выражается в "тиках", да и не сразу может проявиться, + еще оптимизация. Общеизвестные истины ничем не проясняющие конкретный вопрос, впрочем, как я заметил, большинство твоих ответов в такой форме. Еще раз прошу конкретно указать в чем мой код хуже твоего - количество набранных букв (TStrings или TStringList) в качестве аргумента не принимается. Цитата Т.е. данный форум не место или как? И про какой вид речь? Как мне стоило бы это сделать, чтобы вы все нормально поняли? Не язвил, не говорил, что вы лох и т.п. вполне доброжелательно. Или все-же? Если бы ты сам правильный код по данному вопросу написал, а я со своим кривым бы влез, или хотя бы ты доказал существенность моих ошибок... , а так смотри сообщение #8. Цитата Дело не в этом, если помогать, то стараться показывать - как делать правильно, а неправильно они и сами умеют. Если я к примеру пишу код, то стараюсь его выверить, "чтоб комар носа не подточил", правда не всегда этого можно достигнуть, ну не мне рассказывать про невминяемых заказчиков, сроков, неправильной архитектуре и т.д. Насчет неправильно - что неправильно еще раз? Передача параметра по ссылке что ли? И чем хуже передача параметра по ссылке, чем по значению в данном случае? |
|
Сообщение
#13
|
|
|
|
21:03:2008, 07:01
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 878 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 28
|
zubr
Цитата как я заметил, большинство твоих ответов в такой форме. Вот еще один - RTFM Vadik® Ну во первых модераторы тоже люди Во вторых никто и не выясняет отношения, по крайней мере с моей стороны вопросы были по ветке. И к тому же, мне не видится наше обсуждение бесполезным для Dake, по крайней мере оно должно подвигнуть его на выяснение этих вопросов, может он таки почитает чтолибо по этому поводу. А это уже не плохо. |
|
Сообщение
#14
|
|
|
|
21:03:2008, 10:50
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 904 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 11
|
Цитата Вот еще один - 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 байта под ссылку - и весь криминал. Для прикладного программирования это совсем не существенно. Возникает вопрос, чем уж так кривы параметры процедуры моего варианта? По большому счету вопрос выеденного яйца не стоит. |
|
Сообщение
#15
|
|
|
|
21:03:2008, 12:44
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 878 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 28
|
zubr
1. Я вам даже больше скажу, const (в параметрах) - по большому счету - привинтимная мера, т.е. "чтоб даже и не думали", поэтому там разницы и не найдете. 2. Не надо мне приписывать. см #7 Цитата Возникает вопрос, чем уж так кривы параметры процедуры моего варианта? По большому счету вопрос выеденного яйца не стоит. Очень напоминает - "что воля что неволя - все одно" (с) Сказка, не помню какая.Вы вот все-таки нехотите слушать, уперлись рогом в тики. Дело не только в количестве асемблерных инструкций. Возмем к примеру стороннюю библиотеку, неважно кто ее написал, хоть вася пупкин за соседним компом. Там есть некая процедура где в параметрах есть все эти прелести. Что глядя на нее потенциальный пользователь будет понимать? Вот про это и речь. Теперь допустим топикстартер (или еще кто) внял ваши высказывания за чистую монету, и давай кругом это впихивать (разницы то нет). Я бы (думаю и не только) когда-нибудь, но спросили бы у него - "а что за ботву он курит", и каков был бы ответ? Так вот по моему, тут "яйцо" есть. Уж незнаю смог ли сейчас вам донести мысь, - но страрался. PS: Кстати а вот если разницы нет (ну или "выеденного яйца не стоит"), то по каким соображениям вы все-таки поставили, ну хотябы, var? |
|
Сообщение
#16
|
|
|
|
21:03:2008, 15:57
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 904 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 11
|
sax_ol
Блин, что ты прицепился к этой процедуре? Процедура была написана только для наглядности, а не для тиражирования. Я ж не написал библиотеку для дальнейшего применения. Код написанный за 5 минут, только чтобы показать принцип решения вопроса сабжа. В данном коде важно тело процедуры, а не ее параметры. Да возьми большинство учебников по программированию, там код разве оптимизированный, обсосанный со всех сторон выкладывается? В основном выкладывается код в виде более понятном для обсуждаемой темы. То что кто то его будет тупо копировать вместе с оболочкой - это его проблемы. Человек думающий воспользуется принципом решения вопроса, а не тупым копированием, ну а не думающему уже ничего не поможет. Заметь, тема называется Необходимо автоматизировать изменение ширины поля компоненты, а не Как правильно и красиво применять параметры в процедуре. |
|
Сообщение
#17
|
|
|
|
21:03:2008, 16:13
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 878 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 28
|
Да возьми большинство учебников по программированию ... В основном выкладывается код в виде более понятном для обсуждаемой темы. Да да в курсе, на сим и закончим (я пас) ... Эх движек не берет такие ссылки, надо руками ... |
|
Сообщение
#18
|
|
![]() |
|
Текстовая версия | Сейчас: 6:07:2008 - 00:56 |