На главную Наши проекты:
Журнал   ·   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]  все  ( Перейти к последнему сообщению )  
> Визуализация уровня данных
    Цитата ivan1234 @
    Упёрся в следующую проблему - как из консоли, получив промежуточное значения расчёта, открыть форму, вывести на форме значение этого промежуточного результата в виде градации цвета и опять вернуться к расчёту т.д.

    1) Отдельным GUI приложением, связь держать через любой способ - STDIN, сокеты, сообщения, маппинг памяти (имхо для озвученных целей - самое простое)
    2) Изначально сделать GUI приложение, добавить консоль через AttachConsole

    С отображением: помимо грида, можно попробовать с listview, хотя я бы, наверно, сделал paintbox + собственная отрисовка
    Сообщение отредактировано: Fr0sT -
      Цитата Fr0sT @
      С отображением: помимо грида, можно попробовать с listview, хотя я бы, наверно, сделал paintbox + собственная отрисовка


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

      Попробовал вернуться к StringGrid1DrawCell, оказалось, что при правильной настройке параметров таблицы многие проблемы описанные ранее вообще отпали, но пока осталась самая существенная - если матрица значений (цветов) больше окна на форме то при скроле таблицы в моём варианте обновляются цвета ячеек. Есть ли возможность это как то побороть. Допускаю что просто код у меня совершенно кривой, или просто событие OnDrawCell невозможно остановить после первого заполнения таблицы?

      Кусок моего кода, которым заполняется таблица:

      ExpandedWrap disabled
        procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
                                              Rect: TRect; State: TGridDrawState);
          begin
            with StringGrid1 do
              begin
                s:= Random(255);
                Canvas.Brush.Color:=RGB(s,s,s);
                Canvas.FillRect(CellRect(ACol, ARow));
              end;
          end;
         
        procedure TForm1.FormPaint(Sender: TObject);
          begin
            for ARow:=0 to 63 do
              for ACol:=0 to 63 do
                StringGrid1DrawCell(Sender,ACol,ARow,Rect,State);
          end;
        >при скроле таблицы в моём варианте обновляются цвета ячеек
        Естественно, ведь они при перерисовке заполняются случайным серым цветом
        ExpandedWrap disabled
          s:= Random(255);
          Canvas.Brush.Color:=RGB(s,s,s);


        А вот вызывать StringGrid1DrawCell (из Paint) не нужно вообще - событие само возникнет при необходимости перерисовки видимых ячеек, тогда и обработчик вызовется.
          Цитата MBo @
          Естественно, ведь они при перерисовке заполняются случайным серым цветом

          получается так? запускаю программу, программа выполняет главный и вложенный цикл, заполняет таблицу случайным образом и останавливается в конце главного цикла, но... когда я хочу просмотреть ту часть таблицы которая не влезла в окно, эта часть таблицы не статична, а перезаполняется опять новыми случайными числами.... те я уже буду видеть не те начальные данные, а уже изменённые - пока я не пойму как это происходит, и самое главное для чего нужно продолжать закончившийся цикл??
          Цитата MBo @
          событие само возникнет при необходимости перерисовки видимых ячеек

          В том то и дело что мне не нужно перерисовывать первоначально заполненную таблицу, мне нужно её просмотреть, выбрать значимые участки, сделать допустим PS и тд. те в конце главного цикла остановить работу обработчика.

          ЗЫ: понятно что в реальной ситуации вместо генератора в таблицу заносятся реальные значения реальных датчиков, хочу сказать что реализация такого визуального представления даже в кусочном виде позволяет сделать значительный скачок в анализе результатов. Очень жаль что в настоящий момент не получается увидеть сразу всю картину процесса целиком)
          Сообщение отредактировано: ivan1234 -
            Цитата MBo @
            А вот вызывать StringGrid1DrawCell (из Paint) не нужно вообще

            Проверил - если я правильно понял, циклы в моём коде вообще не работают просто по циклам автоматически таблица заполняется полностью вся, размеры которой указаны в параметрах StringGrid. Но остаётся вопрос - как например заполнить таблицу наполовину, и как её зафиксировать?
              Ваша задача - вместо Random обеспечить значение, соответствующее индексам ACol, ARow.
                Цитата MBo @
                Ваша задача - вместо Random обеспечить значение, соответствующее индексам ACol, ARow

                вроде всё работает, но тогда получается что при каждом скроле вся таблица и соответственно весь код по заполнению полностью повторяется и окно полностью перерисовывается начиная с величины сдвига (те таблица не хранится в памяти и не сдвигается окно по таблице). Я конечно проверю, но скорее всего большая матрица будет двигаться по окну как шторка. И второе - поток в этом случае исключается полностью, потому как между вводом данных и выводом результатов на экран есть ещё целая куча математики, которая и так существенно тормозит код.
                  Цитата Fr0sT @
                  можно попробовать с listview

                  Как и всегда оказалось, что если у кого то не получается что то сделать (кто то это конечно же я) - это совершенно не означает что это невозможно осуществить в принципе, просто на тот период у этого "кто то" недостаточно знаний.
                  Перекопав огромное количество примеров оказалось, что listview прекрасно справляется с поставленной задачей, заполняет поле мгновенно, да и скол присутствует в различных видах, правда несколько тормозит при прокрутке всего окна, но на этом этапе для меня этого достаточно.
                  Всем кто принял участие огромное спасибо!
                  Проект который у меня получился выложен здесь:
                  ExpandedWrap disabled
                    unit Unit_1;
                    interface
                    uses
                      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
                      Dialogs, StdCtrls, ExtCtrls, ComCtrls;
                    type
                      TForm1 = class(TForm)
                        ListView1: TListView;
                        procedure FormCreate(Sender: TObject);
                        procedure ListView1Data(Sender: TObject; Item: TListItem);
                     
                        procedure ListView1CustomDrawItem(Sender: TCustomListView;
                                  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
                        procedure ListView1CustomDrawSubItem(Sender: TCustomListView;
                                  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
                                  var DefaultDraw: Boolean);
                     
                      private
                        { Private declarations }
                      public
                        { Public declarations }
                      end;
                     
                    var
                      Form1: TForm1;
                     
                    implementation
                     
                    {$R *.dfm}
                     
                    uses
                      Unit_2;
                     
                    type
                      TColorData=record
                    end;
                     
                    var
                      arr: TSimpleArr;
                      s: Word;
                     
                    procedure TForm1.FormCreate(Sender: TObject);
                    var
                      lc: TListColumn;
                      j: integer;
                        begin
                          MatrData(arr);
                          Listview1.OwnerData:=True;
                          ListView1.ViewStyle:=vsReport;
                          for j:=0 to 10 do
                            begin
                              lc:=ListView1.Columns.Add;
                              lc.Caption:=inttostr(j-1);
                              lc.Width:=42;
                            end;
                          ListView1.RowSelect:=true;
                          ListView1.Items.Count:=Length(arr);
                          Caption:=IntToStr(Length(arr));
                        end;
                     
                     
                    procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
                              Item: TListItem; State: TCustomDrawState;
                              var DefaultDraw: Boolean);
                     
                        begin
                          Sender.Canvas.Brush.Color:=RGB(255,255,255);
                        end;
                     
                    procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
                              Item: TListItem; SubItem: Integer; State: TCustomDrawState;
                              var DefaultDraw: Boolean);
                     
                        begin
                          Sender.Canvas.Brush.Color:=RGB(s,s,s);;
                        end;
                     
                    procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
                    var
                      n, j: integer;
                      begin
                        n:=10;
                        item.Caption:=arr[item.Index,0].caption;
                        for j:= 0 to n-1 do
                          begin
                            item.SubItems.Add(IntToStr(arr[item.Index,j].data));
                            s:= arr[item.Index,j].data;
                          end;
                      end;
                    end.

                  и
                  ExpandedWrap disabled
                    unit Unit_2;
                     
                    interface
                    uses SysUtils;
                      type
                        TColor =record
                          caption:string;
                          data:integer;
                        end;
                        TSimpleArr = array of array of TColor;
                        procedure MatrData(var arr:TSimpleArr);
                     
                    implementation
                     
                    procedure MatrData(var arr:TSimpleArr);
                    var
                      k, n, i, j: integer;
                     
                        begin
                          k:=12000;
                          n:=10;
                          SetLength(arr,k,n);
                          for i := 0 to k-1 do
                            for j:= 0 to n-1 do
                              begin
                                arr[i,j].caption:=inttostr(i);
                                arr[i,j].data:=i*j;
                              end;
                        end;
                     
                    end.
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0325 ]   [ 16 queries used ]   [ Generated: 29.03.24, 10:08 GMT ]