Перейти к содержанию
Fire Monkey от А до Я
  • 0

С помощью каких компонентов проще всего реализовать онлайн чат?


RapsodRF

Вопрос

Всем привет!

Столкнулся с проблемой, нужно создать онлайн-чат с иконками переписчиков.

На подобии как сделали в Viber

Подскажите как правильно это организовать и какие компоненты использовать?

Желательно не использовать чужие компоненты, только FMX.

Заранее благодарю!

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Можно помучаться с TListView, но я остановился на TPresentedScrollBox и стилизованных Label'ах (облачки сообщений, под разные scale на png 9patch), скорость скролла хорошая, плюс есть боунсы и тд.

Приложил исходники проекта, также в архиве отдельно chat.style

procedure TForm2.ChatUp(UsID: integer; LastId: integer; CText: string);
var
  Labb: TLabel;
  Marg: Single;
  LT: TLayout;
begin
  LT := TLayout.Create(PR);
  LT.Parent := PR.Content;
  LT.Margins.Top := 2;
  LT.Align := TAlignLayout.Top;
  LT.Position.Y := PR.ContentBounds.Height + 50;

  Marg := PR.Width * 0.20;

  Labb := TLabel.Create(PR);
  Labb.Parent := PR;
  Labb.Align := TAlignLayout.Top;
  Labb.AutoSize := True;
  Labb.WordWrap := True;
  Labb.TextSettings.WordWrap := True;

  if UsID = 0 then
  begin
    Labb.Margins.Left := Marg;
    Labb.Margins.Right := 4;
    Labb.TextAlign := TTextAlign.Trailing;
    Labb.StyleLookup := 'labelchat_green';
  end
  else
  begin
    Labb.Margins.Right := Marg;
    Labb.Margins.Left := 4;
    Labb.TextAlign := TTextAlign.Leading;
    Labb.StyleLookup := 'labelchat_white';
  end;

  Labb.NeedStyleLookup;
  Labb.Text := ' ' + CText + ' ';
  LT.Height := Labb.Height + 4;
  Labb.Parent := LT;

  if UsID = 0 then
    Labb.Align := TAlignLayout.Right
  else
    Labb.Align := TAlignLayout.Left;
end;

Первые признаки шизофрении:

2016-03-16 19-19-21 Form2.png

Chat.zip

Изменено пользователем zairkz
Ссылка на комментарий
  • 0

zairkz, на картинке видно что размер как-то подсчитывается. Запустил этот пример и вижу:

Screenshot_2016-05-18-10-27-41.png

Почему на коротких словах ширина "облачка" длинная?

И еще вопрос: как можно очистить чат? (как удалить все из TPresentedScrollBox?)

Попробовал так  - безрезультатно - ничего не удаляется.

procedure TFormMain.ChatClean(); 
var
  i: word;
begin
  for i:= Psb.ControlsCount-1 downto 0 do
  if (Psb.Controls[i] is TText) or (Psb.Controls[i] is TLayout) then
    Psb.Controls[i].Free;
end;

 

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

Извиняюсь что долго, перепроверьте процедуру, с размером облок вроде все нормально:

procedure TForm2.ChatUp(UsID: integer; LastId: integer; CText: string);
var
  Labb: TLabel;
  Marg: Single;
  LT: TLayout;
begin
  LT := TLayout.Create(PR);
  LT.Parent := PR.Content;
  LT.Margins.Top := 2;
  LT.Align := TAlignLayout.Top;
  LT.Position.Y := PR.ContentBounds.Height + 50;

  Marg := PR.Width * 0.20;

  Labb := TLabel.Create(PR);
  Labb.Parent := PR;
  Labb.Align := TAlignLayout.Top;
  Labb.AutoSize := True;
  Labb.WordWrap := True;
  Labb.TextSettings.WordWrap := True;

  if UsID = 0 then
  begin
    Labb.Margins.Left := Marg;
    Labb.Margins.Right := 4;
    Labb.TextAlign := TTextAlign.Trailing;
    Labb.StyleLookup := 'labelchat_green';
  end
  else
  begin
    Labb.Margins.Right := Marg;
    Labb.Margins.Left := 4;
    Labb.TextAlign := TTextAlign.Leading;
    Labb.StyleLookup := 'labelchat_white';
  end;

  Labb.NeedStyleLookup;
  Labb.Text := ' ' + CText + ' ';
  LT.Height := Labb.Height + 4;
  Labb.Parent := LT;

  if UsID = 0 then
    Labb.Align := TAlignLayout.Right
  else
    Labb.Align := TAlignLayout.Left;
end;

По поводу очистке

Опишите клас:

TOpenScrollBox = class(TPresentedScrollBox);

до TForm_Main = class(TForm)

...

и процедурка

procedure ClearChildren(AScrollBox: TPresentedScrollBox);
begin
  Assert(AScrollBox <> nil);
  TOpenScrollBox(AScrollBox).Content.DeleteChildren;
  AScrollBox.Repaint;
end;

 

 

Ссылка на комментарий
  • 0

Процедуру перепроверил - один в один - странно, у меня и на андройде, и на Windows одинаковый размер облаков.

Попробовал в Seattle - действительно нормальные размеры облаков, а в Berline все одинакового размера... мдаа...

Изменено пользователем Rusland
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...