Помощь новичкам

Извините, если обидел. Я сам далеко не студент 40 лет уже. В своей среде так общаемся, уже давно, не думал, что это кого-то может обидеть.

1 лайк

Еще раз прошу прощения. Село одним словом.

Вопрос.

 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.
1 лайк

Хотя в некоторых странах даже слова “мама” и “папа” считаются оскорблением, но хотелось бы уточнить, последующие версии PABC.NEТ работают и компилируют под XP без проблем или это зависит от вызываемых в коде функций? (Пока нет на чём проверить)

Также интересует оптимальное решение такой задачи:

  1. в текстовом файле список русских слов;
  2. каждая буква может иметь несколько латинских эквивалентов; (e.g. “а”=a/A/@; “б”=b/B/6; “с”=c/C/s/S/5; “ю”=u/U/YU/yu/iu/IU)
  3. следует записать все варианты написания.

Вроде ничего сложного, но пока не придумал какая структура лучше подходит для расширяемого эквивалента “один-ко-многим”? Спс

Я бы сделал так:

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 не словарь, а лямбду, если вы храните варианты каждой буквы в каком то другом виде.

1 лайк

Не работает графика, базирующаяся на 4.7 - 3D и WPF. Еще была какая-то загвоздочка именно на ХР с какой-то одной функцией, которая в 4.0 и более поздних работает немного по-разному… но весь форум перерывать (это был мой вопрос) - это выше моих сил.

3 лайка

Program1.pas (258 Байты)

Задача о частотном анализе слов легко решается через словарь со счётчиком, а вот как насчёт словосочетаний (до пяти слов)? Бегло проглянул коллокации в поиске – похожие вопросы есть, а вот ответы… Напролом будет сразу добавлять пару слов и по ходу расширять или даже хоть 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д окне вращать сцену? ???