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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2016, 07:29   #1
RomanRens
 
Регистрация: 26.12.2010
Сообщений: 5
По умолчанию Синхронизировать TListBox и TListView

Доброго времени суток, форумчане!

На форме есть TListView с одноформатными записями, например,

Line1
Line2
...
Line5,

а также TListBox, куда при событиях FormShow и ListViewChange переносятся итемы из TListView. Есть ini-файл следующего формата
[ListBox1]
Line1=Значение_1
Line2=Line2
Line3=Значение_3
Line4=Значение_4
Line5=Line5,

т.е в TListBox, необходимо отобразить значения N соответственно элементам в TListView, с возможностью изменения имени в TEdit. Двойной клик по элементу в TListBox должен запускать свойство OnDblClick соответствующей записи в TListView. Проблема в том, что не удается синхронизировать элементы в двух компонентах. Заранее спасибо.

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    cam_act: TListBox;
    Edit1: TEdit;
    Button1: TButton;
    UserListView: TListView;
    procedure FormCreate(Sender: TObject);
    procedure cam_actDblClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure cam_actClick(Sender: TObject);
  private
    { Private declarations }
    procedure ULUpdate;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Ini: Tinifile;
  List: TStringList;

implementation

{$R *.dfm}

procedure TForm1.ULUpdate;
var i: integer;
begin
cam_act.Clear;
List.Clear;

for i:=0 to UserListView.Items.Count-1 do
cam_act.Items.Add(UserListView.Items.Item[i].Caption);

Ini.ReadSection('ListBox1',List);
for i := 0 to List.Count - 1 do
//проблема здесь!!!
cam_act.Items.Strings[UserListView.Items.IndexOf(UserListView.Items.Item[i])]:=
Ini.ReadString('ListBox1', List.Strings[i], '');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Ini:=TiniFile.Create(ExtractFilePath(paramstr(0))+'wm_settings.ini');
List := TStringList.Create;
end;

procedure TForm1.cam_actDblClick(Sender: TObject);
begin
UserListView.ItemIndex:=cam_act.ItemIndex;
ListBox1.OnDblClick(nil);
end;

procedure TForm1.FormDestroy(Sender: TObject);
var i: integer;
begin
for i := 0 to cam_act.Items.Count - 1 do
Ini.WriteString('ListBox1', UserListView.Items.Item[i].Caption, cam_act.Items.Strings[i]);
Ini.Free;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
ULUpdate;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
cam_act.Items[cam_act.ItemIndex] := Edit1.Text;
end;

procedure TForm1.cam_actClick(Sender: TObject);
begin
UserListView.ItemIndex:=cam_act.ItemIndex;
end;

end.

Последний раз редактировалось RomanRens; 15.10.2016 в 07:43.
RomanRens вне форума Ответить с цитированием
Старый 16.10.2016, 10:39   #2
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

Как вариант можно связать через LiveBindings
Replicant вне форума Ответить с цитированием
Старый 16.10.2016, 14:17   #3
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

А вообще все просто:
Код:
procedure TForm1.ListView1Change(Sender: TObject; Item: TListItem;
  Change: TItemChange);
var
  i: integer;
begin
  ListBox1.Clear;
  for i := 0 to ListView1.Items.Count - 1 do
      ListBox1.Items.Add(ini.ReadString('ListBox1', ListView1.Items.Item[i].Caption, 'Банан!'));
end;
Replicant вне форума Ответить с цитированием
Старый 20.10.2016, 15:12   #4
RomanRens
 
Регистрация: 26.12.2010
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Replicant Посмотреть сообщение
А вообще все просто:
Код:
procedure TForm1.ListView1Change(Sender: TObject; Item: TListItem;
  Change: TItemChange);
var
  i: integer;
begin
  ListBox1.Clear;
  for i := 0 to ListView1.Items.Count - 1 do
      ListBox1.Items.Add(ini.ReadString('ListBox1', ListView1.Items.Item[i].Caption, 'Банан!'));
end;
Сделал все так, но вылетает ошибка

Цитата:
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 7640C2F9 in module 'kernel32.dll'. Read of address 00000164'. Process stopped. Use Step or Run to continue.
RomanRens вне форума Ответить с цитированием
Старый 20.10.2016, 22:49   #5
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

Цитата:
Сообщение от RomanRens Посмотреть сообщение
Сделал все так, но вылетает ошибка
Проблема не в этом куске кода, он 100% рабочий, выложите Ваш исходник, попробуем разобраться что не так.
Replicant вне форума Ответить с цитированием
Старый 21.10.2016, 13:17   #6
RomanRens
 
Регистрация: 26.12.2010
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Replicant Посмотреть сообщение
Проблема не в этом куске кода, он 100% рабочий, выложите Ваш исходник, попробуем разобраться что не так.
http://my-files.ru/alvrvm
RomanRens вне форума Ответить с цитированием
Старый 21.10.2016, 16:05   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
procedure TForm1.ButtonDelClick(Sender: TObject);
begin
if UserListView.ItemIndex >=0 then //если  у нас ЕСТЬ выделенная(выбранная) строка то 
UserListView.Items.Item[UserListView.ItemIndex].Delete // мы МОЖЕМ ее удалять
else ShowMessage('вы НИЧЕГО не выбрали в ListView');
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 21.10.2016 в 19:41.
evg_m вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синхронизировать работу программ на виртуальных машинах Yoh C# (си шарп) 6 10.03.2015 14:23
Синхронизировать метод vovik93 C# (си шарп) 3 21.10.2012 21:40
Синхронизировать столбцы по именам tevadim Microsoft Office Excel 5 20.04.2012 17:01
Синхронизировать 2 БД Razyiller SQL, базы данных 13 06.04.2011 06:51
Что означает слово - синхронизировать? Kasper1 Свободное общение 2 04.03.2011 08:27