Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[34.239.150.247] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Цитата ivan1234 @ Упёрся в следующую проблему - как из консоли, получив промежуточное значения расчёта, открыть форму, вывести на форме значение этого промежуточного результата в виде градации цвета и опять вернуться к расчёту т.д. 1) Отдельным GUI приложением, связь держать через любой способ - STDIN, сокеты, сообщения, маппинг памяти (имхо для озвученных целей - самое простое) 2) Изначально сделать GUI приложение, добавить консоль через AttachConsole С отображением: помимо грида, можно попробовать с listview, хотя я бы, наверно, сделал paintbox + собственная отрисовка |
Сообщ.
#17
,
|
|
|
Цитата Fr0sT @ С отображением: помимо грида, можно попробовать с listview, хотя я бы, наверно, сделал paintbox + собственная отрисовка Начал пробовать этот вариант, и при создании первой таблицы выяснилось что для большого количества строк (8000-12000)это очень трудоёмкий процесс, поскольку каждую строку необходимо вносить вручную, можно конечно и программно, но тогда скорость заполнения онлайн значительно снижается. Попробовал вернуться к StringGrid1DrawCell, оказалось, что при правильной настройке параметров таблицы многие проблемы описанные ранее вообще отпали, но пока осталась самая существенная - если матрица значений (цветов) больше окна на форме то при скроле таблицы в моём варианте обновляются цвета ячеек. Есть ли возможность это как то побороть. Допускаю что просто код у меня совершенно кривой, или просто событие OnDrawCell невозможно остановить после первого заполнения таблицы? Кусок моего кода, которым заполняется таблица: 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; |
Сообщ.
#18
,
|
|
|
>при скроле таблицы в моём варианте обновляются цвета ячеек
Естественно, ведь они при перерисовке заполняются случайным серым цветом s:= Random(255); Canvas.Brush.Color:=RGB(s,s,s); А вот вызывать StringGrid1DrawCell (из Paint) не нужно вообще - событие само возникнет при необходимости перерисовки видимых ячеек, тогда и обработчик вызовется. |
Сообщ.
#19
,
|
|
|
Цитата MBo @ Естественно, ведь они при перерисовке заполняются случайным серым цветом получается так? запускаю программу, программа выполняет главный и вложенный цикл, заполняет таблицу случайным образом и останавливается в конце главного цикла, но... когда я хочу просмотреть ту часть таблицы которая не влезла в окно, эта часть таблицы не статична, а перезаполняется опять новыми случайными числами.... те я уже буду видеть не те начальные данные, а уже изменённые - пока я не пойму как это происходит, и самое главное для чего нужно продолжать закончившийся цикл?? Цитата MBo @ событие само возникнет при необходимости перерисовки видимых ячеек В том то и дело что мне не нужно перерисовывать первоначально заполненную таблицу, мне нужно её просмотреть, выбрать значимые участки, сделать допустим PS и тд. те в конце главного цикла остановить работу обработчика. ЗЫ: понятно что в реальной ситуации вместо генератора в таблицу заносятся реальные значения реальных датчиков, хочу сказать что реализация такого визуального представления даже в кусочном виде позволяет сделать значительный скачок в анализе результатов. Очень жаль что в настоящий момент не получается увидеть сразу всю картину процесса целиком) |
Сообщ.
#20
,
|
|
|
Цитата MBo @ А вот вызывать StringGrid1DrawCell (из Paint) не нужно вообще Проверил - если я правильно понял, циклы в моём коде вообще не работают просто по циклам автоматически таблица заполняется полностью вся, размеры которой указаны в параметрах StringGrid. Но остаётся вопрос - как например заполнить таблицу наполовину, и как её зафиксировать? |
Сообщ.
#21
,
|
|
|
Ваша задача - вместо Random обеспечить значение, соответствующее индексам ACol, ARow.
|
Сообщ.
#22
,
|
|
|
Цитата MBo @ Ваша задача - вместо Random обеспечить значение, соответствующее индексам ACol, ARow вроде всё работает, но тогда получается что при каждом скроле вся таблица и соответственно весь код по заполнению полностью повторяется и окно полностью перерисовывается начиная с величины сдвига (те таблица не хранится в памяти и не сдвигается окно по таблице). Я конечно проверю, но скорее всего большая матрица будет двигаться по окну как шторка. И второе - поток в этом случае исключается полностью, потому как между вводом данных и выводом результатов на экран есть ещё целая куча математики, которая и так существенно тормозит код. |
Сообщ.
#23
,
|
|
|
Цитата Fr0sT @ можно попробовать с listview Как и всегда оказалось, что если у кого то не получается что то сделать (кто то это конечно же я) - это совершенно не означает что это невозможно осуществить в принципе, просто на тот период у этого "кто то" недостаточно знаний. Перекопав огромное количество примеров оказалось, что listview прекрасно справляется с поставленной задачей, заполняет поле мгновенно, да и скол присутствует в различных видах, правда несколько тормозит при прокрутке всего окна, но на этом этапе для меня этого достаточно. Всем кто принял участие огромное спасибо! Проект который у меня получился выложен здесь: 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. и 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. |