Извините, если обидел. Я сам далеко не студент 40 лет уже. В своей среде так общаемся, уже давно, не думал, что это кого-то может обидеть.
Еще раз прошу прощения. Село одним словом.
Вопрос.
var отправить1 := new System.Windows.Forms.TextBox;//добавляем текстовое поле
main_form.Controls.Add(отправить1);
отправить1.Bounds := new System.Drawing.Rectangle(10, 50, 100, 50);//местоположение
отправить1.Text := '0';
Размер текстового поля по у не увеличивается, как увеличить?
И как выводить в нем тест с новой строки?
Гуглю, но никак не соображу, как такое простое сделать ????.
п.с. текст должен выводиться в дополнительном окне, в главном выводится графика.
Всм надо чтоб поле становилось шире/уже от разного кол-ва текста? Легче всего добавив обработчик эвента изменения текста:
{$reference System.Windows.Forms.dll}
{$reference System.Drawing.dll}
uses GraphWPF;
uses System.Windows.Forms;
uses System.Drawing;
const
CircW = 30;
begin
var p := new PointF(100, 100);
var v := new PointF(5.5, 5.5);
var v_lock_key := new object;
BeginFrameBasedAnimation(()->
begin
lock v_lock_key do
begin
if
((p.X > Window.Width - CircW) and (v.X > 0)) or
((p.X < CircW) and (v.X < 0))
then v.X *= -1;
if
((p.Y > Window.Height - CircW) and (v.Y > 0)) or
((p.Y < CircW) and (v.Y < 0))
then v.Y *= -1;
p.X += v.X;
p.Y += v.Y;
end;
Circle(p.X, p.Y, CircW, Colors.Red);
end);
var nf := new Form;
var tb := new RichTextBox;//это текстбок, в котором можно выделять текст
nf.Controls.Add(tb);
tb.Multiline := false;
tb.Text := abs(v.X).ToString;
tb.TextChanged += (o,e)->
begin
var sz :=
tb.CreateGraphics
.MeasureString(tb.Text+'__',tb.Font);
tb.Width := Round(sz.Width);
var nv:single;
if TryStrToFloat(tb.Text,nv) then
lock v_lock_key do//Перерисовка происходит в другом потоке, поэтому его надо заблокировать, пока мы изменяем скорость
v := new PointF(nv*Sign(v.X), nv*Sign(v.Y));
end;
Application.Run(nf);
end.
Хотя в некоторых странах даже слова “мама” и “папа” считаются оскорблением, но хотелось бы уточнить, последующие версии PABC.NEТ работают и компилируют под XP без проблем или это зависит от вызываемых в коде функций? (Пока нет на чём проверить)
Также интересует оптимальное решение такой задачи:
- в текстовом файле список русских слов;
- каждая буква может иметь несколько латинских эквивалентов; (e.g. “а”=a/A/@; “б”=b/B/6; “с”=c/C/s/S/5; “ю”=u/U/YU/yu/iu/IU)
- следует записать все варианты написания.
Вроде ничего сложного, но пока не придумал какая структура лучше подходит для расширяемого эквивалента “один-ко-многим”? Спс
Я бы сделал так:
type
ChangeableChar = class
Variants: ICollection<string>;
Next: ChangeableChar;
function GetAllVariants: sequence of string;
begin
if Next = nil then
yield sequence Variants else
foreach var nv in Next.GetAllVariants do
foreach var v in Variants do
yield v+nv;
end;
class function FromString(s:string; conv: char->ICollection<string>): ChangeableChar;
begin
Result := new ChangeableChar;
var curr := Result;
var last := Result;
foreach var ch in s do
begin
curr.Variants := conv(ch);
curr.Next := new ChangeableChar;
last := curr;
curr := curr.Next;
end;
last.Next := nil;
end;
class function FromString(s:string; conv: Dictionary<char, ICollection<string>>) :=
FromString(s,
ch->
conv.ContainsKey(ch)?
conv[ch]:
new string[](ch)//Если в словаре нет аналогов для заданой буквы - то просто скопировать её в результат
);
end;
begin
//var inp := ReadlnString;
var inp := 'abcdef';
var dict := new Dictionary<char, ICollection<string>>;
dict.Add('a',Arr&<string>('[a]','@'));//Можно передавать массив
dict.Add('b',Lst&<string>('[b]','B'));//Или список, или ещё много чего, всё что реализует ICollection
var cc := ChangeableChar.FromString(inp,dict);//Можно передавать сюда
var AllVariants := cc.GetAllVariants;
AllVariants.PrintLines;
end.
Основное преимущество - все варианты вычисляются лениво. То есть их не сохраняет нигде в памяти. Когда тут вызывается PrintLines
- их вычисляет по 1. Но вы можете вместо PrintLines
поставить, к примеру, сохранение в файл.
Так же, можно передать в ChangeableChar.FromString
не словарь, а лямбду, если вы храните варианты каждой буквы в каком то другом виде.
Не работает графика, базирующаяся на 4.7 - 3D и WPF. Еще была какая-то загвоздочка именно на ХР с какой-то одной функцией, которая в 4.0 и более поздних работает немного по-разному… но весь форум перерывать (это был мой вопрос) - это выше моих сил.
Задача о частотном анализе слов легко решается через словарь со счётчиком, а вот как насчёт словосочетаний (до пяти слов)? Бегло проглянул коллокации в поиске – похожие вопросы есть, а вот ответы… Напролом будет сразу добавлять пару слов и по ходу расширять или даже хоть RegEx, но не хочется заново велосипедить
А что именно вы с ними будете делать? С чего бы тот же способ не подошёл?
Println
возвращает yield последовательность, а Transform это экстеншн-метод для массивов.
main_form.Controls.Add(окно_программа);
окно_программа.Bounds := new System.Drawing.Rectangle(10, 90, 420, !!!);//местоположение
окно_программа.Text := 'червячки';
!!! - там что угодно можно писать, текстовое окно по строкам не увеличивается. баг?
кроме того не могу вывести в оконном текстовом окне новую строку.
короче в графическом окне прийдется выводить
Что такое окно_программа? Точнее какой у него тип?
var окно_программа := new System.Windows.Forms.TextBox;//добавляем текстовое поле
сразу недовыделил, извиняюсь.
Делайте RichTextBox, как у меня в примере. Он во всём лучше. Если не вырубать свойство Multiline - то оно ещё и поддерживает несколько строчек. А так, оно ещё и позволяет выделять и копировать текст из себя.
А если много строчек нужно? И как выводить текст с новой строки?
Еще вопрос - как задать первоначальное положение и размер 3д окна ? при использовании uses Graph3D ?
Вы сами поймёте поэкспериментировав несколько мин.
В стандартных модулях паскаля - никак, потому что они запускают окно до выполнения вашего кода.
Их можно потом запустить, сразу после старта.
еще заметил проблему, при одновременном использовании графического окна и 3д с использованием мыши,
procedure MouseUp(x, y, mb: integer);//опрос куда тыкает мыша
begin
при нажатии на графическом окне вылетает ошибка :((((
не пойму, как в 3д окне вращать сцену? ???