IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Криво работает добавление..., в TListView
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской

Репутация: -  0  +


Есть список. List: TListView.

В него слямзенной функцией добавляем из нескольких полей текст. Добавляет очень криво. В Item он добавляет сначала пустую строку потом на следующей введенный текст, а в SubItem наоборот. Что делать не понятно О_О

Заранее спасибо.

Код

procedure TForm1.bbAddClick(Sender: TObject);
  var ListItem : TListItem;
begin
  ListItem := List.Items.Add;

  List.AddItem(edLastName.Text, pointer(edLastName.Text));
  ListItem.SubItems.Add(edName.Text);
  ListItem.SubItems.Add(edOtch.Text);
  ListItem.SubItems.Add(edPhone.Text);
  ListItem.SubItems.Add(edAddress.Text);
  ListItem.SubItems.Add(cbDate.Text + ' ' + cbMounth.Text + ' ' + edYear.Text);
  ListItem.SubItems.Add(edNotes.Text);
end;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 9)
сообщение
Сообщение #2


Гость






Для ViewStyle = vsReport:
procedure TForm1.bbAddClick(Sender: TObject);
var ListItem : TListItem;
begin
ListItem := List.Items.Add;
ListItem.Caption := edLastName.Text;

ListItem.SubItems.Add(edName.Text);
ListItem.SubItems.Add(edOtch.Text);
ListItem.SubItems.Add(edPhone.Text);
ListItem.SubItems.Add(edAddress.Text);
ListItem.SubItems.Add(cbDate.Text + ' ' + cbMounth.Text + ' ' + edYear.Text);
ListItem.SubItems.Add(edNotes.Text);
end;


Так?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской

Репутация: -  0  +


Угу. Спасибки!

А как сделать поиск по subitem'ам? А то он у меня ищет только по Caption'ам видимо. Функция такая (тоже слямзенная ]: )

Код
procedure TForm1.bbSearchClick(Sender: TObject);
  var
  lvItem: TListItem;
begin
  lvItem := List.FindCaption(0, edLastName.Text, True, True, False);
    if lvItem <> nil then
      begin
      List.Selected := lvItem;
      lvItem.MakeVisible(True);
      List.SetFocus;
      end
    else ShowMessage('Запись не найдена');

end;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Вообще-то это есть в DRKB (ссылка - в самом начале страницы):
function FindListViewItem(lv: TListView; const S: string; column: Integer): TListItem; 

var
i: Integer;
found: Boolean;
begin
Assert(Assigned(lv));
Assert((lv.viewstyle = vsReport) or (column = 0));
Assert(S <> '');
for i := 0 to lv.Items.Count - 1 do
begin
Result := lv.Items[i];
if column = 0 then
found := AnsiCompareText(Result.Caption, S) = 0
else
if column > 0 then
found := AnsiCompareText(Result.SubItems[column - 1], S) = 0
else
found := False;

if found then Exit;
end;

// No hit if we get here
Result := nil;
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской

Репутация: -  0  +


А как заюзать данную функцию по нажатию на кнопасу?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Ты бы все-таки Drkb скачал, там очень много полезной информации...
procedure TForm1.Button1Click(Sender: TObject); 
var
lvItem: TListItem;

begin
// ищем текст из edit1 в столбце subitem[0]
lvItem := FindListViewItem(ListView1, Edit1.Text, 1);

// если нашли - показываем
if lvItem <> nil then begin

ListView1.Selected := lvItem;
lvItem.MakeVisible(True);
ListView1.SetFocus;

end;
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской

Репутация: -  0  +


А как редактировать SubItem, например по двойному клику?

Сообщение отредактировано: Beowulf 13th -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской

Репутация: -  0  +


google не помог... need help )':
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской

Репутация: -  0  +


И еще вопрос. Слямзил функцию

Код

procedure LV_FindAndSelectItems(lv: TListView; const S: string; column: Integer);
var
  i: Integer;
  found: Boolean;
  lvItem: TListItem;
begin
  Assert(Assigned(lv));
  Assert((lv.ViewStyle = vsReport) or (column = 0));
  Assert(S <> '');
  for i := 0 to lv.Items.Count - 1 do
    begin
    lvItem := lv.Items[i];

    if column = 0 then
      found := AnsiCompareText(lvItem.Caption, S) = 0
    else
      if column > 0 then
        begin
          if lvItem.SubItems.Count >= Column then
            found := AnsiCompareText(lvItem.SubItems[column - 1], S) = 0
          else
            found := False;
          end
      else
        found := False;

      if found then
        begin
          lv.Selected := lvItem;
        end;
    end;

end;


Она выделяет все найденные соответсвтия.

Но! Если использовать ее во второй раз - он добавит новый результ к старому, то есть выделятся строки, найденные за два запроса. Делал так:

Код

for i := 1 to List.Items.Count - 1 do
  List.Items.Item[i].Selected := false;


он выделение снимает, но все равно скалдывает два результата. Помагает только клик по List: TListView.

Как это исправить?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Могу показать, как можно определить тот Caption, на котором был Double-Click (вообще GetItemAt не работает с SubItems, а работает только с первым столбцом ЛистВью, элементы которого можно выделить мышью, но с помощью вот такого финта можно это добавить):

var
pX, pY: integer;

procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
// Запоминаем координаты, где была нажата мышка
pX := X; pY := Y; // Чтобы не мучаться с переводом в локальные координаты для ListView
end;


// Ну, и собственно обрабатываем двойное нажатие:
procedure TForm1.ListView1DblClick(Sender: TObject);
var
li, root: TListItem;
i, curr_left: integer;
begin
// Сначала пробуем найти итем непосредственно, это сработает только для первого столбца
li := ListView1.GetItemAt(pX, pY);
if assigned(li) then ShowMessage(li.Caption)
else begin

// если мы здесь - это признак того, что дабл-клик был не на первом столбце...
// тогда делаем вот что: пробегаем по всем длинам заголовков столбцов, и
// накапливаем их длину до тех пор, пока она не превысит координату X нажатия мыши
//
i := 0; curr_left := ListView1.Columns[0].Width;
while (curr_left + ListView1.Columns[i].Width < pX) do begin
inc(curr_left, ListView1.Columns[i].Width);
inc(i);
end;

// теперь находим, какой элемент является "корнем" для искомого SubItem-а
root := ListView1.GetItemAt(10, pY);

// Если "корень" найден, и у него есть столько "детей" - то
// печатаем Caption соответствующего "ребенка"
if (assigned(root)) and (i < root.SubItems.Count) then showmessage(root.SubItems[i]);

end;
end;

Можно используя этот код вместо ShowMessage вызывать, например, диалоговое окно, которое будет запрашивать новое значение, и после ввода менять соотв. Caption... Не пробовал, но по-моему должно работать...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.10.2020 17:38
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name