![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Две проблемки с TStringList [D5, Win95/98]
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()
помоему так:)