Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> StringGrid удаление строки с Objects 
:(
    Опции темы
creas0ft
  Дата 31.3.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 5.8.2006
Где: Саранск

Репутация: нет
Всего: 2



Вернемся к вопросу об удалении - добавлении строчек в StringGrid.
Данный код работает замечательно, но начинаются баги когда кол-во строк не помещается на экране. Прокручиваем список вниз и удаляем последнюю или предпоследнюю строку.
Часа 3 бъюсь - понять не могу. ((
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, Menus, ExtCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    PopupMenu1: TPopupMenu;
    Delete1: TMenuItem;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Delete1Click(Sender: TObject);
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    procedure Timer1Timer(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
  private
    { Private declarations }
  public
    procedure SGDeleteRow(SG: TStringGrid; RowToDelete: Integer);

  end;

var
  Form1: TForm1;

implementation
var
  cr: Integer = 0;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  R: TRect;
begin
  StringGrid1.RowCount := StringGrid1.RowCount + 1;
  StringGrid1.Cells[0, StringGrid1.RowCount - 1] := IntToStr(Random(100));

  StringGrid1.Objects[1, StringGrid1.RowCount - 1] := TProgressBar.Create(StringGrid1);
  R := StringGrid1.CellRect(1, StringGrid1.RowCount - 1);

  TControl(StringGrid1.Objects[1, StringGrid1.RowCount - 1]).Parent := StringGrid1;
  TControl(StringGrid1.Objects[1, StringGrid1.RowCount - 1]).Left := StringGrid1.Left + R.Left;
  TControl(StringGrid1.Objects[1, StringGrid1.RowCount - 1]).Top := StringGrid1.Top + R.Top;
  TControl(StringGrid1.Objects[1, StringGrid1.RowCount - 1]).Width := R.Right - R.Left;
  TControl(StringGrid1.Objects[1, StringGrid1.RowCount - 1]).Height := R.Bottom - R.Top;
  TControl(StringGrid1.Objects[1, StringGrid1.RowCount - 1]).Visible := True;
  TProgressBar(StringGrid1.Objects[1, StringGrid1.RowCount - 1]).Max := 100;
  TProgressBar(StringGrid1.Objects[1, StringGrid1.RowCount - 1]).Position := Random(100);
  with TProgressBar(StringGrid1.Objects[1, StringGrid1.RowCount - 1]) do
    if R.Right = R.Left then            {ïðÿìîóãîëüíèê ÿ÷åéêè íåâèäèì}
      Visible := False
    else
      begin
        InflateRect(R, -1, -1);
        OffsetRect(R, StringGrid1.Left + 1, StringGrid1.Top + 1);
        BoundsRect := R;
        Visible := True;
      end;



end;

procedure TForm1.SGDeleteRow(SG: TStringGrid; RowToDelete: Integer);
var
  i: Integer;
  t: TProgressBar;
begin
  if SG.Objects[1, RowToDelete] is TControl then
    begin
      t := TProgressBar(SG.Objects[1, RowToDelete]);
      t.Free;
    end;
  sg.Rows[RowToDelete].Clear;



  for i := RowToDelete to SG.RowCount - 2 do
    begin
      if SG.Objects[1, i + 1] is TControl then
        SG.Objects[1, i] := SG.Objects[1, i + 1];
      SG.Rows[i].Assign(SG.Rows[i + 1]);

    end;
  SG.RowCount := SG.RowCount - 1;
end;



procedure TForm1.Delete1Click(Sender: TObject);
begin
  if cr = 0 then exit;
  Timer1.Enabled := False;
  SGDeleteRow(StringGrid1, cr);
  Timer1.Enabled := True;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  cr := ARow;
  form1.Caption := IntToStr(cr) + ' / ' + IntToStr((sender as TStringGrid).RowCount);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i: Integer;
begin
//  form1.Caption := IntToStr(StringGrid1.RowCount - 1);
  for i := 0 to StringGrid1.RowCount - 1 do
    if StringGrid1.Objects[1, i + 1] is TControl then
      TProgressBar(StringGrid1.Objects[1, i + 1]).Position := Random(100);

end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if StringGrid1.Objects[ACol, ARow] is TControl then
    begin
      TControl(StringGrid1.Objects[ACol, ARow]).Left := Rect.Left;
      TControl(StringGrid1.Objects[ACol, ARow]).Top := Rect.Top;
      TControl(StringGrid1.Objects[ACol, ARow]).Width := Rect.Right - Rect.Left;
      TControl(StringGrid1.Objects[ACol, ARow]).Height := Rect.Bottom - Rect.Top;
      TProgressBar(StringGrid1.Objects[ACol, ARow]).Position := Random(100);
//      TControl(StringGrid1.Objects[ACol, ARow]).Visible := True;
    end
  else
    Exit;

end;

end.



--------------------
Форум программистов уклонистов в сторону сео-шмео
PM MAIL WWW ICQ   Вверх
creas0ft
Дата 31.3.2007, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 5.8.2006
Где: Саранск

Репутация: нет
Всего: 2



Решение все еще интересно, но отрисовку я сделал сам, без progressbar.
--------------------
Форум программистов уклонистов в сторону сео-шмео
PM MAIL WWW ICQ   Вверх
MetalFan
Дата 31.3.2007, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



вот в аттаче круто урезанное и поправленное приложение) 
пойдет?

Это сообщение отредактировал(а) MetalFan - 31.3.2007, 20:52

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  test.rar 6,29 Kb


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0431 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.