Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2008, 01:15   #1
elfo
Новичок
Джуниор
 
Регистрация: 24.06.2008
Сообщений: 2
По умолчанию Выделение строки (canvas) в StringGrid

Уважаемые знатоки! Очень прошу помочь разобраться!
Дана матрица StringGrid - заполняется она случайными числами от -100 до 100 на двойной щелчок мыши. Последний столбец матрицы выводит сумму четных чисел в каждой строке. Сравнивая эти суммы, я должна выбрать наименьшую, и строку, где она находится, выделить рамкой.
Все работает, наименьшая сумма находится, номер строки тоже, а вот canvas не могу сделать..
Привожу код формы. Предполагаю, что ошибка где-то в последнем фрагменте.
Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, ExtCtrls;
type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    ComboBox1: TComboBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label5: TLabel;
    Label4: TLabel;
    Label6: TLabel;
    procedure RadioButton1Click(Sender: TObject);
    procedure RadioButton2Click(Sender: TObject);
    procedure RadioButton3Click(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDblClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  i, j, k, s1, s2, s, k2, SumStr, str, stlb, n, x1, x2, x3, y1, y2, ind: integer;
  
implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.RadioButton1Click(Sender: TObject);
begin
str:=6;
StringGrid1.RowCount:=str;
StringGrid1.Height:=154;
end;

procedure TForm1.RadioButton2Click(Sender: TObject);
begin
str:=7;
StringGrid1.RowCount:=str;
StringGrid1.Height:=178;
end;

procedure TForm1.RadioButton3Click(Sender: TObject);
begin
str:=8;
StringGrid1.RowCount:=str;
StringGrid1.Height:=205;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
stlb:=StrToInt(Combobox1.text);
StringGrid1.ColCount:=stlb+1;
ind:=stlb+1;
if (stlb=6) then StringGrid1.Width:=458
else if (stlb=7) then StringGrid1.Width:=525
else if (stlb=8) then StringGrid1.Width:=590;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
flog.Close;
end;

procedure TForm1.FormDblClick(Sender: TObject);
begin
randomize;
//заполнение матрицы случайными числами в диапазоне -100..100
For i:=0 to StringGrid1.RowCount - 1 do
    for j:=0 to StringGrid1.ColCount - 2 do
    StringGrid1.Cells[j,i]:=IntToStr(random(201)-100);

    //подсчет суммы четных элем. строк
    for i:=0 to StringGrid1.RowCount - 1 do
    begin
    SumStr:=0;
        for j:=0 to StringGrid1.ColCount - 2 do
        begin
             if (StrToInt(StringGrid1.Cells[j,i]) mod 2 = 0) then
                begin
                k:=StrToInt(StringGrid1.Cells[j,i]);
                SumStr:=SumStr+k;
                end;
        end;
        //занесение сумм в j-1 столбец матрицы
        StringGrid1.Cells[StringGrid1.ColCount-1,i]:=IntToStr(SumStr);
    end;

    //перебор элементов последнего столбца для поиска наименьшего
for j:=StringGrid1.ColCount - 2 to StringGrid1.ColCount - 1 do
        begin
        s:=StrToInt(StringGrid1.Cells[j,0]);
        n:=0;
             for i:=0 to StringGrid1.RowCount-2 do
                begin
                s1:=StrToInt(StringGrid1.Cells[j,i+1]);
                if s>s1 then
                        begin
                        n:=i+1;  //номер строки с наим.элементом
                        s:=s1;   //значение наим.элемента
                        end;
                end;
        
end;
Label5.Caption:=IntToStr(s);
Label6.Caption:=IntToStr(n);

for i := 0 to StringGrid1.RowCount - 1 do begin
  k2 := StrToInt(StringGrid1.Cells[StringGrid1.ColCount - 1, i]);
  if k2 = s then begin

  if n=0 then begin
        y1:=0;
        y2:=0;
        x2:=ind*25;
        x1:=y2;
        x3:=25;
        end;

        if n=1 then begin
        y1:=0;
        y2:=25;
        x2:=ind*25;
        x1:=y2;
        x3:=y2*2;
        end;

        if n=2 then begin
        y1:=0;
        y2:=50;
        x2:=ind*25;
        x1:=y2;
        x3:=75;
        end;

        if n=3 then begin
        y1:=0;
        y2:=75;
        x2:=ind*25;
        x1:=y2;
        x3:=100;
        end;

        if n=4 then begin
        y1:=0;
        y2:=100;
        x2:=ind*25;
        x1:=y2;
        x3:=125;
        end;

        if n=5 then begin
        y1:=0;
        y2:=125;
        x2:=ind*25;
        x1:=y2;
        x3:=150;
        end;

  StringGrid1.Canvas.Pen.Color := clGreen;
  StringGrid1.Canvas.Pen.Width := 1;
  StringGrid1.Canvas.MoveTo(y1,y2);
  StringGrid1.Canvas.LineTo(x2,x1);
  StringGrid1.Canvas.LineTo(x2,x3);
  StringGrid1.Canvas.LineTo(x2*(-1),x3);
  end;
end;
end;
end.
elfo вне форума Ответить с цитированием
Старый 24.06.2008, 12:12   #2
elfo
Новичок
Джуниор
 
Регистрация: 24.06.2008
Сообщений: 2
По умолчанию

спасибо, разобралась сама. дело было в переменной ind, которая вместо задаваемого в combobox количества столбцов, имела значение 0. тему можно закрыть.
elfo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделение объектов в Canvas... Roof Общие вопросы Delphi 4 10.08.2008 13:31
выделение строк цветом в StringGrid kate158 Помощь студентам 1 06.08.2008 09:56
Выделение в StringGrid Лубышев Помощь студентам 2 08.06.2008 21:05
StringGrid: Выделение и закрашивание mazdakilla Общие вопросы Delphi 1 14.05.2008 22:55
График в Canvas (с масштабированием) из StringGrid. PereCCC Помощь студентам 1 11.05.2008 10:45