На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА 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_
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Визуализация уровня данных
    Здравствуйте!
    Заранее оговорюсь - я не программист, я только учусь.
    Стояла задача визуализировать некоторую матрицу данных (или поток).
    Для определения матрицы данных использовалась консоль (в рамках получения цифр этого было достаточно).
    А вот для визуализации консоли оказалось недостаточно.
    16 цветов (симпатично, но не информативно)

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

    Может кто подскажет как получить чёрное поле с данными матрицы 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 и заполнял ячейки цветом. Тогда и скролить было бы можно. Осталось найти такой компонент
                    >Осталось найти такой компонент
                    Так сам грид всё умеет. Пример


                    >как скролить такой большой массив как в примере?
                    Отрисовать матрицу в битмап, битмап на PaintBox, лежащем на ScrollBox.
                    Если размеры слишком велики, то битмап вообще можно не создавать (размеры ограничены, памяти нужно много),
                    а рассчитывать часть матрицы, помещающуюся в скроллируемое окно (ScrollBox), и только эту часть выводить.



                    >как к скролу дополнительно добавить поток строк?
                    Что это означает??
                      Цитата MBo @
                      Отрисовать матрицу в битмап, битмап на PaintBox, лежащем на ScrollBox.

                      С битмапом пока не разобрался, если я правильно понял необходимо заранее создать 256 картинок с градацией серого, где то его хранить, если на диске, то боюсь опять возникнут проблемы со скоростью, если создавать в процессе запуска программы, то как это правильно реализовать пока не знаю, потому как ООП для меня пока как для чайника))

                      Цитата MBo @
                      >как к скролу дополнительно добавить поток строк?
                      Что это означает??

                      всё очень просто: (в общем смысле) какой либо процесс имеет свой спектральный состав - это строка частот с различными амплитудами... но процессы очень редко бывают стабильными во времени, а на осциллограмме мы видим только мгновенное состояние спектра. Получив поток таких строк позволит более детально изучить изменение спектра во времени, тем более что время изменения спектра ничтожно мало. Т.е. при постоянном анализе на поле формы хотелось бы увидеть постоянно меняющуюся в реальном времени матрицу спектра. В console это прекрасно реализуется, но к сожалению только цифрами.
                      Сообщение отредактировано: ivan1234 -
                        >если я правильно понял необходимо заранее создать 256 картинок с градацией серого,
                        Видимо, неправильно.
                        ООП тут ни при чём.

                        >изменение спектра во времени
                        Посмотрите, что такое сонограмма
                          Цитата MBo @
                          Видимо, неправильно.

                          может посоветуете литературу в которой хорошо разжёвано про Bitmap?
                          Цитата MBo @
                          Посмотрите, что такое сонограмма

                          здесь я совсем не понял, как это относится к моему вопросу, ну существует такой термин в медицине, возможно что то отдалённо похожее я хочу увидеть у себя на экране... и что? меня интересует как это реализовать, а не как это назвать
                            https://ru.wikipedia.org/wiki/Спектрограмма

                            Вопрос про скролл я сначала понял как скроллирование окна, поскольку размер 12000 указан.

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

                              именно так и спрашивалось в 1 пункте, а 2 пункт это одновременная реализация скрола и бегущая строка, по крайней мере так реализовано в консоли.

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


                              Что касаемо Bitmap, то в инете про него от 2 предложений до 2 страниц (для профессионалов), я же не профессионал и мне этих 2 страниц мало, тем более что всё описание Bitmap отирается на классы, методы и свойства, а ООП я только начал изучать)

                              Добавлено

                              я работаю в области металловедения (структуры, состояния, характеристики, свойства и тд), а привёл простейший пример известный даже школьнику чтобы было понятно что мне нужно получить на выходе, а СПЕКТРОГРАММА в определении википедии лишь частный случай возможного применения такого метода
                              Сообщение отредактировано: ivan1234 -
                                Цитата ^D^ima @
                                Я бы выбрал визуальный компонент типа Grid

                                Цитата MBo @
                                Так сам грид всё умеет


                                Попробовал этот вариант. Всё заполняет, есть скрол, но:
                                1. На вскидку обращение к ячейкам таблицы работает в 2 раза медленнее чем обращение к координатам точки
                                2. Встроенная сетка несколько мешает восприятие зрительной информации (как её убрать сетку не знаю, потому как чайник)
                                3. Скол работает как скрол строки, а не всей таблицы и в месте фокуса затирает значение
                                4. Когда доходит до последней строчки окна начинает скролить таблицу, но изменяет размер ячеек по высоте и затирает информацию в невидимых строках

                                В общем исходя их выше сказанного, наилучшим способом оказалось обращение к координатам пикселя, хотелось только добавить туда работоспособный скрол.
                                Был бы очень благодарен за кусок кода, который позволил бы это реализовать.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0445 ]   [ 17 queries used ]   [ Generated: 2.05.24, 09:46 GMT ]