Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Две проблемки с TStringList [D5, Win95/98]


Страницы:   1 2 3

MegaVolt ©   (2005-01-10 16:32:00) 

Есть 2 проблемы при исспользовании TStringList:
1. При изменении размеров колонок автоматически происходит сортировка :( Как можно этого избежать?
Вот код:

procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
 x1,y1:integer;
begin
 StringGrid1.MouseToCell(x,y,x1,y1);
 if y1=0
   then
     case x1 of
       1:Displ.Sort(SortName);
       2:Displ.Sort(SortSize);
       3:Displ.Sort(SortPath);
     end;
 UpdateDispl;
end;


2. Прокрутка колёсиком работает по разному в зависимости от того загружен драйвер мыши или нет. А так же от типа драйвера :( В одном случае прокрутка работает так как нужно в другом по StringGrid бежит полоска выделения :( Пользователи жалуются а как убрать я не знаю :( Может кто посодействует?

Заранее благодарен :)


MegaVolt   (2005-01-12 09:10:00) [21]

Спасибо буду пробовать :) О результатах сообщу.


begin...end   (2005-01-11 17:57:00) [22]

Поправка к [22]: OwnerData должно быть, наоборот, True.


begin...end   (2005-01-11 17:56:00) [23]

> [21] MegaVoltik   (11.01.05 17:31)

Вот, наваял небольшой примерчик.

Поместите на форму ListView и Button. У ListView установите свойство OwnerData в False (это и делает его виртуальным) и добавьте 2 колонки (свойство Columns). Для ListView определите обработчики OnData и OnCustomDrawItem (см. код ниже).

Вот код модуля формы:

unit Unit1;

interface

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

type
 PMyRecord = ^TMyRecord;

 TMyRecord = record
   Index: Integer;
   IntField: Integer;
   Color: TColor
 end;

 TForm1 = class(TForm)
   ListView1: TListView;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure ListView1Data(Sender: TObject; Item: TListItem);
   procedure ListView1CustomDrawItem(Sender: TCustomListView;
     Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
 private
   { Private declarations }
   List: TList;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
 ItemsCount = 100;
var
 I: Integer;
 pR: ^TMyRecord;
begin
 List := TList.Create;
 for I := 1 to ItemsCount do
 begin
   New(pR);
   with pR^ do
   begin
     Index := I;
     IntField := Random(1000);
     Color := TColor(Random($7FFFFFFF))
   end;
   List.Add(pR)
 end;
 ListView1.Items.Count := ItemsCount;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
 I: Integer;
begin
 if Assigned(List) then
   for I := 0 to Pred(List.Count) do
     Dispose(PMyRecord(List.Items[I]));
 List.Free
end;

procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
var
 Index: Integer;
begin
 if Assigned(List) then
 begin
   Index := Item.Index;
   if Index < List.Count - 1 then
   begin
     Item.Caption := IntToStr(PMyRecord(List.Items[Index])^.Index);
     Item.SubItems.Add(IntToHex(PMyRecord(List.Items[Index])^.Color, 8))
   end
 end;
end;

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
 Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
 if Assigned(List) then
   (Sender as TListView).Canvas.Font.Color := PMyRecord(List.Items[Item.Index])^.Color
end;

end.


Нажмите кнопку.

Заметьте, что если увеличить константу ItemsCount (например, 1000), работать будет ненамного медленнее.

См. также пример из Delphi: {Delphi}\Demos\Virtual Listview.


MegaVoltik   (2005-01-11 17:31:00) [24]

Присваиваются Cell.


begin...end   (2005-01-11 17:23:00) [25]

> [19] MegaVoltik   (11.01.05 17:17)

Данные прорисовываются в обработчике OnDrawCell или присваиваются массиву Cells?


MegaVoltik   (2005-01-11 17:17:00) [26]

Данные в TList а элементами TList являются записи. Код чего нужно привести? У меня проблема с TStringGrid плохо работает прокрутка и при изменении размеров колонок одновременно вызывается сортировка. Код вроде выше привёл.


begin...end   (2005-01-11 17:03:00) [27]

> [17] MegaVolt ©   (11.01.05 16:54)

Как сейчас организовано отображение данных в TStringGrid? Где находятся сАми данные? В TStringList? Код - ?


MegaVolt   (2005-01-11 16:54:00) [28]


> Именно виртуальный тормозит? Интересненько. Особенно в сравнении
> с TStringGrid.

Извиняй я невнимателен. Что значит виртуальный? Мне отображать список нуна а что толку от виртуального? Или я что то не понимаю?


begin...end   (2005-01-11 15:07:00) [29]

> [15] MegaVolt ©   (11.01.05 15:06)

> > По делу: использовать ListView. Виртуальный.
> Тормозит он.

Именно виртуальный тормозит? Интересненько. Особенно в сравнении с TStringGrid.


MegaVolt   (2005-01-11 15:06:00) [30]


> Как вариант - проверять. что курсор мыши "стрелочка" а не
> "ресайз".

Почему то в OnMouseUp курсор всегда обычный :(

> Да и на OnMouseDown я бы перенес.

Это не есть гуд :( Когда пользователь только нажал на заголовок сортировки ещё не должно быть.

ДумкинПонял :( Если не найду варианта покрасивее так и сделаю.


> По делу: использовать ListView. Виртуальный.

Тормозит он.


begin...end   (2005-01-11 14:57:00) [31]

> [11] MegaVolt ©   (11.01.05 14:50)

По делу: использовать ListView. Виртуальный.


Думкин   (2005-01-11 14:53:00) [32]

0. TNewStringGrid = class(TStringGrid)
1. DrawInfo: TGridDrawInfo;
2. CalcDrawInfo(DrawInfo);CalcSizingState(X, Y, State, Index, Pos, Ofs, DrawInfo);
3. if State = gsColSizing then


KSergey   (2005-01-11 14:51:00) [33]

Как вариант - проверять. что курсор мыши "стрелочка" а не "ресайз". Да и на OnMouseDown я бы перенес.

PS
Весь EhGrid построен на опознавании текущего вида курсора.. Я офигел, когда увидел...


MegaVolt   (2005-01-11 14:50:00) [34]

А по делу так же красиво и остроумно слабо? А то к описке так прицепились а по делу 0 :(


Ega23   (2005-01-11 14:49:00) [35]

KSergey ©   (11.01.05 14:48) [9]

:о)


KSergey   (2005-01-11 14:48:00) [36]

> [6] Ega23 ©   (11.01.05 14:42)
> Чё-то я не пойму: а при чём тут TStringList?????????

Тссс... Главное они друг друга понимают :)


MegaVolt   (2005-01-11 14:47:00) [37]

TStringList ни при чём. ОписАлся я :(


Poirot   (2005-01-11 14:43:00) [38]

упс.. моя промазать:)


Ega23   (2005-01-11 14:42:00) [39]

Чё-то я не пойму: а при чём тут TStringList?????????


Poirot   (2005-01-11 14:25:00) [40]

OnColumnClick()
помоему так:)


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо