• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Dake
  • Дата начала
D

Dake

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

zubr

Код:
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;
 
D

Dake

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

zubr

Ну хоть чуть чуть, надо и самому мозги включать.
Код:
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.
 
Z

zubr

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

zubr

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

zubr

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

Vadik(R)

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

zubr

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

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

zubr

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

zubr

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!