Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.30;
Скачать: CL | DM;

Вниз

столбцов в StringGrid   Найти похожие ветки 

 
XfroSt   (2005-10-05 10:09) [0]

Пишу вот такой код для сортировки столбцов в стринггрид. В идеале хочу получить что то типа нажимаем на заголовок столбца и таблица сортируется.

procedure Tsresult.GridSort(StrGrid: TStringGrid; NoColumn: Integer);
Var
Line,
PosActual: Integer;
Row     :       TStrings;
Renglon :       TStringList;
begin
 Renglon := TStringList.Create;
 For Line := 1 to StrGrid.RowCount-1 do
 Begin
   PosActual := Line;
   Row.Assign(TStringlist(StrGrid.Rows[PosActual]));
   While True do
   Begin
     If (PosActual = 0) Or (StrToInt(Row.Strings[NoColumn-1]) >=
         StrToInt(StrGrid.Cells[NoColumn-1,PosActual-1])) then
       Break;
     StrGrid.Rows[PosActual] := StrGrid.Rows[PosActual-1];
     Dec(PosActual);
   End;
   If StrToInt(Row.Strings[NoColumn-1]) < StrToInt(StrGrid.Cells[NoColumn-1,PosActual]) then
     StrGrid.Rows[PosActual] := Row;
 End;
 Renglon.Free;
end;

но при проходжении
Row.Assign(TStringlist(StrGrid.Rows[PosActual]));
вылетает ошибка AccesVialation ни как не могу понять в чем дело...
Поможите?
Или может есть уже готовые компоненты СтрингГрид с такими функциями?


 
Leonid Troyanovsky ©   (2005-10-05 10:19) [1]


> XfroSt   (05.10.05 10:09)  

> Или может есть уже готовые компоненты СтрингГрид с такими
> функциями?


Можно и самому приготовить

http://groups.google.com/group/fido7.ru.delphi/msg/8c27f707490716b2

--
Regards, LVT.


 
XfroSt   (2005-10-05 10:46) [2]

idx.Sort(@fCompare);
в этом месте пишет
variable required...


 
sniknik ©   (2005-10-05 11:51) [3]

"забей" на StringGrid, пользуйся ClientDataSet/ADODataSet-ом для хранения данных там и функционал побольше (сортировка есть) и работает побыстрее (на порядки).
к базе подключать не обязательно, CreateDataSet делает "оторванный" набор в памяти.


 
XfroSt   (2005-10-05 12:14) [4]

счас попробую...


 
XfroSt   (2005-10-05 12:21) [5]

с бд довольно гимморно, нашел компонент POwerGrid тут http://downloads.ru/win/1955.hts но чтт то там какая то байда с добавлением строк и функциями а-ля colWidth....


 
Seg   (2005-10-05 12:40) [6]

ошибка AccesVialation
Вылетает, если компонент не найден.
Надо использовать FindComponent


 
XfroSt   (2005-10-05 12:45) [7]

Спасибо, но вот код который  очень быстро и грамотно все делает:

procedure SortStringGrid(var GenStrGrid: TStringGrid; ThatCol: Integer);
const
  // Define the Separator
 TheSeparator = "@";
var
  CountItem, I, J, K, ThePosition: integer;
  MyList: TStringList;
  MyString, TempString: string;
begin
  // Give the number of rows in the StringGrid
 CountItem := GenStrGrid.RowCount;
  //Create the List
 MyList        := TStringList.Create;
  MyList.Sorted := False;
  try
    begin
      for I := 1 to (CountItem - 1) do
        MyList.Add(GenStrGrid.Rows[I].Strings[ThatCol] + TheSeparator +
          GenStrGrid.Rows[I].Text);
      //Sort the List
     Mylist.Sort;

      for K := 1 to Mylist.Count do
      begin
        //Take the String of the line (K – 1)
       MyString := MyList.Strings[(K - 1)];
        //Find the position of the Separator in the String
       ThePosition := Pos(TheSeparator, MyString);
        TempString  := "";
        {Eliminate the Text of the column on which we have sorted the StringGrid}
        TempString := Copy(MyString, (ThePosition + 1), Length(MyString));
        MyList.Strings[(K - 1)] := "";
        MyList.Strings[(K - 1)] := TempString;
      end;

      // Refill the StringGrid
     for J := 1 to (CountItem - 1) do
        GenStrGrid.Rows[J].Text := MyList.Strings[(J - 1)];
    end;
  finally
    //Free the List
   MyList.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Sort the StringGrid1 on the second Column
 // StringGrid1 nach der 1. Spalte sortieren
 SortStringGrid(StringGrid1, 1);
end;


Может еще комунить пригодится....


 
XfroSt   (2005-10-05 12:54) [8]

соответсвенно еще вопрос: А как пехватить клик на заголовке колонки ? или обязательно вставлять кнопку в ячейку?


 
Leonid Troyanovsky ©   (2005-10-05 12:58) [9]


> XfroSt   (05.10.05 10:46) [2]
> idx.Sort(@fCompare);
> в этом месте пишет
> variable required...


Возможно, что fCompare у тебя метод (формы).
Кроме того, со времен D3 изменилась декларация OnDrawCell,
т.е., нужно ACol, ARow instead Col, Row.

--
Regards, LVT.


 
sniknik ©   (2005-10-05 13:44) [10]

> с бд довольно гимморно
не особо. когда разберешся.

> но вот код который  очень быстро и грамотно все делает:
насколько быстро? миллион записей за 2-3 сек? а если по нескольким полям сортировка? в обратном порядке (DESC)? по выражению? сортировка фильтрованного?

если хоть чтото из упомянутого предполагается, то подумай все же о бд. проще счас разобраться чем потом переделывать.


 
XfroSt   (2005-10-05 14:35) [11]

Да вы правы при бд больше место для маневров больше, обязательно изучу, но пока нужно просто и быстро....

Так не подскажите как отловить клик мышки на ячейках нулевых строк (заголовке колонок). ?


 
Leonid Troyanovsky ©   (2005-10-05 14:37) [12]


> XfroSt   (05.10.05 14:35) [11]

> Так не подскажите как отловить клик мышки на ячейках нулевых
> строк (заголовке колонок). ?


http://groups.google.com/group/borland.public.delphi.vcl.components.using/msg/9dc5e0ee1124be68

--
Regards, LVT.


 
sniknik ©   (2005-10-05 15:05) [13]

> обязательно изучу, но пока нужно просто и быстро....
с бд так и есть. очень просто. а уж как быстро... (сравни со своим кодом сортировки в стринггриде)

для примера
Unit1.Pas
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, DB, Grids, DBGrids, ADODB, Math, StdCtrls;

type
 TForm1 = class(TForm)
   DSet: TADODataSet;
   DBGrid: TDBGrid;
   DSetID: TIntegerField;
   DSetName: TStringField;
   DSetFlSum: TFloatField;
   DSource: TDataSource;
   Zap_Label: TLabel;
   Edit1: TEdit;
   Button1: TButton;
   Time_Label: TLabel;
   procedure FormCreate(Sender: TObject);
   procedure DBGridTitleClick(Column: TColumn);
   procedure Button1Click(Sender: TObject);
 private
 public
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 DSet.CreateDataSet;
 Randomize;
end;

procedure TForm1.DBGridTitleClick(Column: TColumn);
var
 OldTime: TDateTime;
 st: string;
begin
 Screen.Cursor:= crHourGlass;
 try
   OldTime:= Now;
   DSet.Sort:= Column.FieldName;
   DateTimeToString(st, "n:ss:zzz", Now() - OldTime);
   Time_Label.Caption:= "Время выполнения : "+st;
 finally
   Screen.Cursor:= crDefault;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 i, n: integer;
 OldTime: TDateTime;
 st: string;
begin
 DSet.DisableControls;
 Screen.Cursor:= crHourGlass;
 try
   OldTime:= Now;
   if DSet.RecordCount > 0 then begin
     DSet.Close;
     DSet.CreateDataSet;
   end;

   for i:= 0 to StrToIntDef(Edit1.Text, 10) do begin
     n:= Random(1000);

     DSet.Append;
     DSetID.AsInteger:= n;
     DSetName.AsString:= "Name for "+IntToStr(n);
     DSetFlSum.AsFloat:= RoundTo(Random*1000, -2);
   end;
   DSet.Post;

   DSet.First;

   DateTimeToString(st, "n:ss:zzz", Now() - OldTime);
   Time_Label.Caption:= "Время выполнения : "+st;
 finally
   Screen.Cursor:= crDefault;
   DSet.EnableControls;
 end;
end;

end.


Unit1.Dmf
object Form1: TForm1
 Left = 222
 Top = 107
 Width = 639
 Height = 474
 Caption = "Form1"
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = "MS Sans Serif"
 Font.Style = []
 OldCreateOrder = False
 OnCreate = FormCreate
 DesignSize = (
   631
   447)
 PixelsPerInch = 96
 TextHeight = 13
 object Zap_Label: TLabel
   Left = 409
   Top = 14
   Width = 49
   Height = 13
   Caption = "Записей :"
 end
 object Time_Label: TLabel
   Left = 8
   Top = 16
   Width = 107
   Height = 13
   Caption = "Время выполнения : "
 end
 object DBGrid: TDBGrid
   Left = 8
   Top = 40
   Width = 609
   Height = 401
   Anchors = [akLeft, akTop, akRight, akBottom]
   DataSource = DSource
   TabOrder = 0
   TitleFont.Charset = DEFAULT_CHARSET
   TitleFont.Color = clWindowText
   TitleFont.Height = -11
   TitleFont.Name = "MS Sans Serif"
   TitleFont.Style = []
   OnTitleClick = DBGridTitleClick
 end
 object Button1: TButton
   Left = 528
   Top = 8
   Width = 91
   Height = 25
   Anchors = [akTop, akRight]
   Caption = "Заполнение"
   TabOrder = 1
   OnClick = Button1Click
 end
 object Edit1: TEdit
   Left = 464
   Top = 10
   Width = 57
   Height = 21
   Anchors = [akTop, akRight]
   MaxLength = 7
   TabOrder = 2
   Text = "10000"
 end
 object DSet: TADODataSet
   Parameters = <>
   Left = 16
   Top = 88
   object DSetID: TIntegerField
     DisplayLabel = "Номер"
     FieldName = "ID"
   end
   object DSetName: TStringField
     DisplayLabel = "Имя"
     FieldName = "Name"
     Size = 30
   end
   object DSetFlSum: TFloatField
     DisplayLabel = "Сумма"
     FieldName = "FlSum"
   end
 end
 object DSource: TDataSource
   DataSet = DSet
   Left = 48
   Top = 88
 end
end


обрати внимание, весь код в основном впомагательный, всю "работу"/сортировку делает строка DSet.Sort:= Column.FieldName;
ну разве это не просто? проще по моему не бывает.



Страницы: 1 вся ветка

Текущий архив: 2005.10.30;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.027 c
14-1129105703
Slider007
2005-10-12 12:28
2005.10.30
Проблема с ICQ траффиком


14-1129103667
Андрей Жук
2005-10-12 11:54
2005.10.30
Фленов о .NET


1-1128932639
BanderLog
2005-10-10 12:23
2005.10.30
RadioButton + onChecking (onChecked)


3-1127212198
mrAld
2005-09-20 14:29
2005.10.30
Модификация полей в наборе данных ADO


2-1128782315
ArtemESC
2005-10-08 18:38
2005.10.30
округление Extended.