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

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

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.07.2009, 15:02   #1
Vipa
 
Регистрация: 29.07.2009
Сообщений: 7
По умолчанию ListView DragDrop

Добрый день! Очень нужна помощь!
После того как меняю порядок элементов в ListView по средствам DragDrop и нажимаю Shift+стрелка вверх\вниз выделяет все элементы от того места где был схвачен item до места куда был установлен - как побороть? Вот немного кода:
Код:
procedure TGridEditorFrm.clvFieldsDragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
  Accept:= (Sender = clvFields);
end;

procedure TGridEditorFrm.clvFieldsDragDrop(Sender, Source: TObject; X,
  Y: Integer);
var
  a,b,i,j: integer;
begin
  bitbtn1.Enabled:=true;
  a:= clvFields.ItemFocused.index;
  b:=clvFields.Items.IndexOf(clvFields.GetItemAt(X,Y));
  j:=0;
  if b >= 0 then begin
    if a > b then
      for i:= a downto b+1 do begin
        Swap(a-j,i-1);
        j:=j+1;
      end
    else
      for i:= a to b-1 do begin
        Swap(a+j,i+1);
        j:=j+1;
      end;
  end;
  clvFields.ClearSelection;
  clvFields.ItemFocused:=clvFields.Items[b];
  clvFields.Selected:=clvFields.Items[b];
end;

procedure TGridEditorFrm.Swap(i,j: integer);
var
   tempLI: TListItem;
 begin
   clvFields.Items.BeginUpdate;
   try
     tempLI := TListItem.Create(clvFields.Items);
     tempLI.Assign(clvFields.Items.Item[i]);
     clvFields.Items.Item[i].Assign(clvFields.Items.Item[j]);
     clvFields.Items.Item[j].Assign(tempLI);
     tempLI.Free;
   finally
     clvFields.Items.EndUpdate
   end;
end;
procedure TGridEditorFrm.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key=VK_DOWN) or (Key=VK_UP) then
    if clvFields.Focused=false then clvFields.SetFocus;
  if (Shift<>[ssShift]) then begin
    if (Key=VK_DOWN) then begin
      clvFieldsClick(nil);
    end;
    if (Key=VK_UP) then begin
      clvFieldsClick(nil);
    end;
  end;
end;
зарание спасибо!
Vipa вне форума Ответить с цитированием
Старый 30.07.2009, 11:57   #2
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Мм, не понятно. Перетащили значит строки по компоненту, они встали где надо. Потом выделили одну строку и нажали Shift+(вверх/вниз) и от этого выделились все строки под и над выбранной строкой? Что там не так? Как же компонент должен был среагировать, так что же хотите?
Alter вне форума Ответить с цитированием
Старый 30.07.2009, 13:15   #3
Vipa
 
Регистрация: 29.07.2009
Сообщений: 7
По умолчанию

Добавил изображение которое, думаю, ответит на поставленный вопрос!
Еще надо добавить то, что ожидался переход на одну запись вверх, то есть на стрелку нажал один раз!
Изображения
Тип файла: jpg ListView.jpg (47.2 Кб, 172 просмотров)

Последний раз редактировалось Vipa; 30.07.2009 в 13:31.
Vipa вне форума Ответить с цитированием
Старый 31.07.2009, 12:10   #4
Vipa
 
Регистрация: 29.07.2009
Сообщений: 7
По умолчанию

в DragDrop:
Нашел причину трабла: не обновляется позиция мультиселекта, если сделать ckvFields.MultiSelect:=false; clvFields.multiselect:=true; указатель перемещается куда надо, но при дальнейшем использовании - например если записывать по клику в Edit текст из listView - появляется ошибка Access violation at address 005CEF64 in module
скорее всего снова путаются индексы
Vipa вне форума Ответить с цитированием
Старый 31.07.2009, 12:49   #5
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

У вас же есть там кнопки для перемещения вверх-вниз, можно перехватывать нажатия и отправлять кнопкам Click. Например:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage('UP');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 ShowMessage('DOWN');
end;

procedure TForm1.ListView1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 IF (ssShift in Shift)And(Key=VK_UP) then
  Button1Click(nil) {своё действие}
 else
   IF (ssShift in Shift)And(Key=VK_DOWN) then
    Button2Click(nil); {своё действие}
end;
Alter вне форума Ответить с цитированием
Старый 31.07.2009, 14:27   #6
Vipa
 
Регистрация: 29.07.2009
Сообщений: 7
По умолчанию

Не подходит! Если строчка меняет позицию все ломается (первый случай на картинках), если поставить Multiselect:=true .. false - откуда не пытайся всатвить ее в Edit вылазит ошибка! Есть еще одна вещь - (без Multiselect:=false ,,true) если взять в руки мышу и клякнуть по записи - все работает, но вызовы MouseDown Click MouseUp - никчиму не приводят, все остается как было! Вот еще немного кода
Код:
procedure TGridEditorFrm.clvFieldsClick(Sender: TObject);
var item: integer;
begin
{$IFDEF VCL}
  clvFields.ItemFocused.CancelEdit;
{$ENDIF}
  sbUp.Enabled:=true;
  sbDown.Enabled:=true;
  if clvFields.ItemFocused.Index >= 0 then
    if clvFields.SelCount = 1 then begin      edCaption.Text:=TColumn(clvFields.Items[clvFields.ItemFocused.Index].SubItems.Objects[0]).title.caption;
      case TColumn(clvFields.Items[clvFields.ItemFocused.Index].SubItems.Objects[0]).Alignment of
        taCenter: rgAlignment.ItemIndex:=0;
        taLeftJustify: rgAlignment.ItemIndex:=1;
        taRightJustify: rgAlignment.ItemIndex:=2;
      end;
      cbVisible.Checked:=TColumn(clvFields.Items[clvFields.ItemFocused.Index].SubItems.Objects[0]).Visible;
      edWidth.Text:=IntToStr(TColumn(clvFields.Items[clvFields.ItemFocused.Index].SubItems.Objects[0]).Width);
  end;
end;
наверное надо было его сразу прислать!
Vipa вне форума Ответить с цитированием
Старый 31.07.2009, 16:11   #7
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Скачайте исходники плеера здесь
http://www.programmersforum.ru/showt...9261#post39261
и посмотрите или там список ведет себя так как вам надо.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 31.07.2009, 16:53   #8
Vipa
 
Регистрация: 29.07.2009
Сообщений: 7
По умолчанию

Цитата:
Скачайте исходники плеера здесь
http://www.programmersforum.ru/showt...9261#post39261
и посмотрите или там список ведет себя так как вам надо.
именно так и надо!

Последний раз редактировалось Vipa; 31.07.2009 в 17:07.
Vipa вне форума Ответить с цитированием
Старый 03.08.2009, 10:18   #9
Vipa
 
Регистрация: 29.07.2009
Сообщений: 7
По умолчанию

Подскажите как подобное сделать в ListView? У меня не получилось
Vipa вне форума Ответить с цитированием
Старый 05.08.2009, 00:16   #10
silverworld
Заблокирован
 
Регистрация: 01.08.2009
Сообщений: 8
По умолчанию ListView DragDrop

Не могу сообразить как отобразить данные из столбцов Cursor в ListView

раньше при отображении данных использовал ArrayAdapter c переобределенным getView

нашел CursorAdapter, но в нем надо переопределять 2 абстрактных метода что в какой писать тоже не понятно

может кто поделится примерами или ссылками?
silverworld вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как перетащить элемент ListView в другой ListView? Paul Hindenburg Компоненты Delphi 5 26.01.2013 11:35
Listview Neymexa Общие вопросы .NET 2 28.04.2009 21:13
ListView Cpluser Общие вопросы .NET 4 13.04.2009 22:45
ListView Drain Общие вопросы Delphi 3 13.02.2008 16:10
ListView Garacio Компоненты Delphi 1 17.12.2006 15:30