На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Визуализация уровня данных
Здравствуйте!
Заранее оговорюсь - я не программист, я только учусь.
Стояла задача визуализировать некоторую матрицу данных (или поток).
Для определения матрицы данных использовалась консоль (в рамках получения цифр этого было достаточно).
А вот для визуализации консоли оказалось недостаточно.
16 цветов (симпатично, но не информативно)

Прикреплённый файлПрикреплённый файлCON_1.png (14,18 Кбайт, скачиваний: 16)

Может кто подскажет как получить чёрное поле с данными матрицы 100 х 2000, в которой значения изменяются от 0 до 100, каждое значение это ячейка на 2 символа, а цвет ячейки это интенсивность белого цвета, которое соответствует значению матрицы.
Создайте битмап, в нужных местах рисуйте прямоугольники соответствующего цвета

ExpandedWrap disabled
        l := value * 255 div 100;
        bmp.Canvas.Brush.Color := RGB(l,l,l);
        bmp.Canvas.FillRect(...)
Цитата MBo @
Создайте битмап

Спасибо за направление, буду изучать поскольку совершенно не знаком с формами, т.к. по специальности я физик
Цитата ivan1234 @
Создайте битмап

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

ExpandedWrap disabled
    unit unit2;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormPaint(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    type
      TFigure = class
      private
        {Private declarations }
        FX,FY:integer; // поля координаты
        FColor:integer; // поле цвет
        Fn:integer; // поле длина ребра
      public
        { Public declarations }
        procedure Paint; virtual; abstract;
        procedure SetColor(c:integer);
        procedure Coordinates(X,Y:integer);
        property Color : integer read FColor write SetColor; // Свойство цвет
        property n : integer read Fn write Fn; // Свойство ребро
        property X : integer read FX write FX; // Свойство координата X
        property Y : integer read FY write FY; // Свойство координата Y
      end;
     
     
    type
      TSquare = class(TFigure)
      private
        { Private declarations }
      public
        { Public declarations }
        procedure Paint();override; {переопределяем базовый метод}
      end;
     
    type
      TMyObjects = class
      private
        { Private declarations }
        ArrObj: Array of TFigure; {массив, элементами которого являются объекты нашего типа TSquare}
      public
        { Public declarations }
        procedure AddFigure(X,Y,Color,n:integer);
        procedure RePaint();
        procedure RePaint2();
      end;
     
     
    var
      Form1: TForm1;
      MyObjects:TMyObjects;
      v, g: Byte;
     
    implementation
     
    {$R *.dfm}
     
    { TFigure }
    procedure TFigure.Coordinates(X, Y: integer);
      begin
        FX:=X;
        FY:=Y;
      end;
     
    procedure TFigure.SetColor(c: integer);
      begin
        FColor:=c;
      end;
     
    { TSquare }
    procedure TSquare.Paint;
      begin
        Form1.Canvas.Brush.Color := FColor;
        Form1.Canvas.Rectangle(X,Y,X+n,Y+n); //рисуем квадрат
      end;
     
    { TMyObjects }
    procedure TMyObjects.AddFigure(X, Y, Color,n: integer);
    var
      i:integer;
      b:byte;
      begin
        b := 0;
        for i:=0 to Length(ArrObj)-1 do
          if ArrObj[i] = nil then
            begin
              b := 1;
              Break;
            end;
        if b = 0 then //нет свободных, увеличим массив
          begin
            SetLength(ArrObj, Length(ArrObj)+1);
            i := Length(ArrObj)-1;
          end;
        ArrObj[i]:=TSquare.Create;
        ArrObj[i].Coordinates(x,y);
        ArrObj[i].SetColor(Color);
        ArrObj[i].n:=n;
    end;
     
    procedure TMyObjects.RePaint;
    var
      i:integer;
      begin
        for i:=0 to Length(ArrObj)-1 do
          if ArrObj[i] <> nil then
            ArrObj[i].Paint;
      end;
     
    procedure TMyObjects.RePaint2;
    var
      i:integer;
      Color:integer;
      begin
        i:= 10;
        Color:= RGB(Random(255),Random(255),Random(255));
        MyObjects.AddFigure(g*10,v*10,Color,i);
        MyObjects.RePaint;
      end;
     
    procedure TForm1.FormPaint(Sender: TObject);
      begin
        for v:=0 to 63 do
          for g:=0 to 63 do
            MyObjects.RePaint2;
      end;
     
    procedure TForm1.FormCreate(Sender: TObject);
      begin
        MyObjects := TMyObjects.Create;
      end;
     
    end.


... Но почему так медленно??? С такой скоростью просто в мусорку.
Может есть какой нибудь способ побороть этот недостаток?
Процедура AddFigure реализована плохо. Расширение массива на единицу - неправильный подход, медленный и
может жрать память (в зависимости от версии Delphi и соотв. менеджера памяти)

А вообще я не вижу смысла во введении всех этих объектов. Никакого полезного функционала, по крайней мере в текущей реализации, они в себе не содержат.

Так что лучше использовать то, что я посоветовал: матрица данных у Вас уже есть, в ней содержится вся необходимая информация. По значению элемента считаете цвет, рисуете прямоугольник. Лишние прокладки - нафиг.
Сообщение отредактировано: MBo -
Цитата MBo @
Процедура AddFigure реализована плохо

)за что купил, за то продал
попробовал ваш совет:
ExpandedWrap disabled
    procedure TForm1.FormPaint(Sender: TObject);
      begin
        for v:=0 to 12000 do
          for g:=0 to 63 do
            with Form1.Canvas do
              begin
                s:= Random(255);
                Pen.Color:=RGB(s,s,s);
                Brush.Color:=RGB(s,s,s);
                Rectangle(10*g, 10*v, 10*g+10, 10*v+10);
              end;
      end;

работает значительно быстрее - просто замечательно
Но по ходу изучения возникло ещё 2 вопроса:
1. как скролить такой большой массив как в примере?
2. как к скролу дополнительно добавить поток строк?
Цитата ivan1234 @
1. как скролить такой большой массив как в примере?
2. как к скролу дополнительно добавить поток строк?

Я бы выбрал визуальный компонент типа Grid и заполнял ячейки цветом. Тогда и скролить было бы можно. Осталось найти такой компонент
"Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,1347 ]   [ 21 queries used ]   [ Generated: 5.08.20, 01:16 GMT ]