Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
В разделе приведен пример использования компонента TListView для визуализации и анализа результатов моделирования. Работа модуля сводится к тому, что по мере выполнения расчетов с разными входными параметрами сохраняется история вычислений. При этом сохраняются интегральные результаты и графическое представление полученной выборки. Пользователь имеет возможность сравнивать результаты последнего эксперимента и выбранного в истории, а также изменять последовательность экспериментов в истории или удалять их (рис. 11).
Для хранения истории результатов в табличном виде используется компонент TListView, который находится на вкладке Win32 палитры компонентов Delphi. После размещения компонента на форме необходимо установить его свойства:
· ViewStyle à vsReport;
· ReadOnly, RowSelect à true;
· GridLines (линии таблицы) à true;
· в редакторе свойства Columns указать подписи для всех столбцов.
|
Рис. 11. Форма для визуализации результатов
Создадим класс TExper для хранения входных параметров, интегральных результатов вычислений и битового образа графика.
TExper = class(TObject)
Public
//различные интегральные результаты
disp: TBitmap; //графики
selected: boolean; //нужно ли записывать в отчет
//конструктор класса
constructor Create(результаты);
end;
После расчета программа визуализирует полученную выборку на графике и сохраняет результаты в глобальной переменной TempExper – экземпляре класса TExper. Для сохранения в объектной переменной битового образа графика используются следующие фрагменты кода:
Form1.Chart1.CopyToClipboardBitmap; //Копируем в буфер обмена
...
//из буфера обмена в битовый массив
var i:integer;
bmp: TBitmap;
begin
if Clipboard.HasFormat(CF_BITMAP) then
begin
bmp:= TBitmap.Create; bmp.LoadFromClipBoardFormat(cf_BitMap,
ClipBoard.GetAsHandle(cf_Bitmap),0);
TempExper.disp:= bmp;
end;
end;
Для хранения информации о расчетах в программе используется «разреженный массив» ExperList, реализованный как массив указателей. После сохранения результатов в переменной TempExper, в массив ExperList добавляется указатель ExperList.Add(TempExper). Теперь заполним записями элемент TListView.
procedure TForm1.ListRefresh;
var
i: Integer;
ListItem: TListItem;
Temp: TExper; // переменная класса записи
begin
with ListView1 do
begin
Clear;//очищаем все записи
Checkboxes:= true;//разрешаем CheckBox в 1 столбце
ViewStyle:= vsReport;
for i:=0 to ExperList.Count - 1 do
begin
Temp:= ExperList[i];//Массив записей
ListItem:= Items.Add;//создаем новую запись в ListView
ListItem.SubItems.Add(IntToStr(Temp.statistics));
//Тут добавляем столько данных, сколько столбцов
ListItem.Checked:= Temp.selected;
ListItem.ImageIndex:= i;//номер записи будет полезен //при работе с функциями перемещения и удаления.
end;
end;
end;
Первый столбец содержит поле CheckBox, это дает возможность пользователю отмечать интересующие записи для формирования отчета. На рис. 11 видно, что на двух верхних графиках представлены результаты последнего расчета, а на двух нижних графиках – результаты выделенного из списка расчета. Пользователь щелчком мыши на интересующей строке списка выделяет результаты для визуализации на нижних графиках. Для реакции на это действие пользователя необходимо создать обработчик события OnSelectItem компонента TListView.
procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem; Selected: Boolean);
var Temp: TExper;
i: integer;
begin
//если выделили существующую запись – делаем все
//строки списка активными, иначе нет
GroupBox1.Visible:= Selected;//вывод интегр.результатов
SpeedButton1.Enabled:= Selected;//кнопка переместить вверх
SpeedButton2.Enabled:= Selected;//кнопка переместить вниз
SpeedButton3.Enabled:= Selected;//кнопка удалить
Temp:= ExperList[Item.Index];
RedrawIntegralRes(1, Temp); //рисуем скриншот графика
Image1.Picture.Assign(Temp.disp);
end;
Если в список результатов будет занесено большое количество записей, может быть удобным перемещение записей по списку и возможность удаления записи. Обработчик события нажатие кнопки «Переместить вверх»:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if(ListView1.Selected.ImageIndex > 0) then
begin
//iSelected глобальная перем. –номер выделенной записи
iSelected:= ListView1.Selected.ImageIndex;
SaveList;//если в поле CheckBox выставлен флажок – надо //сохранить его, т.к. при перерисовке все будет утеряно
ExperList.Move(ListView1.Selected.ImageIndex, ListView1.Selected.ImageIndex - 1);
ListRefresh; //обновляем список
ListView1.ItemIndex:= iSelected - 1;
//выделенная запись переместилась вверх
end;
end;
//процедура сохранения списка
procedure TForm1.SaveList;
var i:integer;
Temp: TExper;
begin
with ListView1 do
begin
for i:=0 to Items.Count-1 do
begin
Temp:= ExperList[i];
Temp.selected:= ListView1.Items[i].Checked;
end;
end;
end;
Аналогичным образом работают процедуры перемещения записи вниз и удаления.
Дата публикования: 2014-11-03; Прочитано: 435 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!