Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.04.2013, 00:48
Corwin13 Corwin13 вне форума
Прохожий
 
Регистрация: 05.04.2013
Сообщения: 20
Версия Delphi: Enterprise 7.0
Репутация: 10
По умолчанию Выделенный пункт в listbox

Есть два листбокса, в первом создаются пункты, во втором подпункты первого. Нужно сделать чтобы при выделении пункта листбокса1 подгружался список в листбокс2 относящийся именно к этому пункту.

Скажем:

Listbox1 ----------------Listbox2
Литеоратура ----------------Книги
----------------Журналы
----------------Газеты

Документы ---------------Шаблоны
---------------Накладные

ну и тд.
Часть сделал что касаемо листбокса1- сохранение/чтение, а вот со второй частью пока тупик.
Код:
procedure LoadListbox1Listbox2(const Groupname:string);
procedure TForm1.FormCreate(Sender: TObject);
var
    llist:tstringlist;
    i:integer;
begin

  llist:=tstringlist.create;
  llist.Clear;
  Listbox1.Clear;
  Edit1.Clear;
  try
    if fileexists('c:\Listbox1.pdb') then
       llist.LoadFromFile('c:\Listbox1.pdb')
  except

 end;
  for i:=0 to lList.Count-1 do
  begin
     Listbox1.AddItem(llist[i],nil);
  end;
  llist.Free;
 // Listbox1.ItemIndex:=0;
end;
procedure TForm1.N4Click(Sender: TObject);

var i:integer;
    llist:tstringlist;
begin

  if messagedlg('Вы действительно хотите удалить группу ',mtConfirmation,[mbNo,mbYes],0)=mrYes then begin
     Listbox1.DeleteSelected;
     llist:=tstringlist.create;
     llist.Clear;
     
        llist.AddStrings(Listbox1.Items);
     end;

     try

       llist.SaveToFile('c:\Listbox1.pdb');
     except

     end;
     llist.Free;
  end;


procedure TForm1.N3Click(Sender: TObject);
var newstr:string;
      i:integer;
      llist:tstringlist;
begin


  NewStr:=InputBox('Новая группа','Введите имя группы','');
  if newstr<>'' then
  begin
  Listbox1.Items.Add(newstr);

     llist:=tstringlist.create;
     llist.Clear;
    
     begin
        
        llist.AddStrings(Listbox1.Items);
     

       llist.SaveToFile('c:\Listbox1.pdb');
       llist.Free;

end;

end;


 end;

procedure TForm1.Listbox1Change(Sender: TObject; Item: TListItem;
  Change: TItemChange);
 var
 i:integer;
begin
 
  if Listbox1.Items.Count>0 then
     if (Listbox1.ItemIndex>=0) and (Listbox1.ItemIndex<Listbox1.Items.Count) then
       //LoadListbox1Listbox2(Listbox1.Items.);

 
end;
procedure LoadListbox1Listbox2(Const Groupname:string);
 var i,cur:integer;
     sec:tstringlist;
begin
 
 sec:=tstringlist.Create;

   try
     
     if form1.ListBox1.ItemIndex=0 then begin
        for i:=0 to sec.Count-1 do begin
          form1.ListBox2.Items.Add(Sec[i]);
        
         
        end;
      end;
      if form1.ListBox1.itemindex>0 then begin
        for i:=0 to  sec.Count-1 do begin
        
              cur:=form1.ListBox2.ItemIndex;
              form1.ListBox2.Items[cur]:=sec[i];
            
          end;
        end;
   
    except
   
    end;
  end;
 

procedure TForm1.N5Click(Sender: TObject);
var newcat:string;
      i:integer;
      clist:tstringlist;
begin


  Newcat:=InputBox('Новая категория','Введите имя категории','');
  if newcat<>'' then
  begin
  Listbox2.Items.Add(newcat);

     clist:=tstringlist.create;
     clist.Clear;
   

     begin
        
        clist.AddStrings(Listbox2.Items);
       

       clist.SaveToFile('c:\Listbox2.pdb');
       clist.Free;

end;

end;


 end;


procedure TForm1.N6Click(Sender: TObject);
var i:integer;
    clist:tstringlist;
begin

  if messagedlg('Вы действительно хотите удалить категорию ',mtConfirmation,[mbNo,mbYes],0)=mrYes then begin
     Listbox2.DeleteSelected;
     clist:=tstringlist.create;
     clist.Clear;
     //for i:=0 to Listbox1.Items.Count do begin
       // llist.add(Listbox1.Items[i]);
        clist.AddStrings(Listbox2.Items);
     end;

     try

       clist.SaveToFile('c:\Listbox2.pdb');
     except

     end;
     clist.Free;
  end;

end.
Ответить с цитированием
  #2  
Старый 17.04.2013, 01:13
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вот, первое что в голову пришло
Код:
procedure TForm1.ListBox1Click(Sender: TObject);
begin

 case Listbox1.ItemIndex of
0: ListBox2.Items.Text:='Книги'+#13+'Журналы'+#13+'Газеты';
1: ListBox2.Items.Text:='Шаблоны'+ #10 + 'Накладные';
end;
{
if Listbox1.Items.Strings[Listbox1.ItemIndex]=  'Литеоратура' then
ListBox2.Items.Text:='Книги'+#13+'Журналы'+#13+'Газеты'
else
ListBox2.Items.Text:='Шаблоны'+#10+'Накладные';
 }
end;
Ответить с цитированием
  #3  
Старый 24.04.2013, 13:30
Corwin13 Corwin13 вне форума
Прохожий
 
Регистрация: 05.04.2013
Сообщения: 20
Версия Delphi: Enterprise 7.0
Репутация: 10
По умолчанию

Немного продвинулось дело, но не дорабатывает до конца. По trace видно что при выделении строки в listbox1 -выводится список поочереди всех строк записанных в listbox2, но в конце выводится только последняя запись. Привожу код:
Код:
unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, ExtCtrls, ToolWin, Menus, inifiles, StdCtrls, Buttons,
  ActnList, shellApi,AppEvnts, XPMan;

type
  TForm = class(TForm)
    ActionList1: TActionList;
     ExitOnEsc: TAction;
    ApplicationEvents1: TApplicationEvents;
    N15: TMenuItem;
    N30: TMenuItem;
    PageControl1: TPageControl;
     Panel1: TPanel;
      status: TStatusBar;
        ToolBar3: TToolBar;
      StatusBar2: TStatusBar;
    Listbox1: TListBox;
    PopupMenu2: TPopupMenu;
    N6: TMenuItem;
    N7: TMenuItem;
    ListBox2: TListBox;
    PopupMenu3: TPopupMenu;
    N8: TMenuItem;
    N9: TMenuItem;
    procedure FormCreate(Sender: TObject);
     procedure FormActivate(Sender: TObject);
      procedure N6Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
     procedure Listbox1Change(Sender: TObject);
  procedure Listbox2Change(Sender: TObject; Item: TListItem;
  Change: TItemChange);
   procedure New_exe(Sender: TObject);
   private
    { Private declarations }
  public
    { Public declarations }
  end;


// My functions
procedure LoadListbox(Const Groupname:string);
var
  ini2:TiniFile;
implementation

uses new_cat;
procedure TForm.FormCreate(Sender: TObject);
var UT,AN,glist:tstringlist;
    m,k,n,i:integer;
    cfgini:Tinifile;
    llist:tstringlist;
begin
  dir:=extractfilepath(application.ExeName);
  
  ini2:=tinifile.create(dir+'Listbox2.pdb');
   /////////////////////
  llist:=tstringlist.create;
  llist.Clear;
  Listbox1.Clear;
  try
    if fileexists(dir+'Listbox1.pdb') then
       llist.LoadFromFile(dir+'Listbox1.pdb')
  except
   
 end;
 
  for i:=0 to lList.Count-1 do begin
     Listbox1.AddItem(lList[i],nil);
  end;
  lList.Free;
  /////////////////
 procedure TForm.Listbox2Change(Sender: TObject; Item: TListItem;Change: TItemChange);
var i:integer;
begin

  for i:=0 to 10 do begin
    try
      if ini2.readstring(item.Caption,'c'+inttostr(i),'@')<>'@' then
 
      except
        
      end;
  end;

end;


procedure TForm.FormActivate(Sender: TObject);
begin
  
    if Listbox2.Items.Count>0 then
    //Listbox2.Items[0].selected:=true;

   Listbox1.Update;

   Listbox2.Update;

   Listbox2.Realign;
  Listbox1.Realign;

/////////////////////////////
procedure TForm.Listbox1Change(Sender: TObject);

 var
 i:integer;
 Item: TListItem;
 Change: TItemChange;
begin

  if Listbox1.Items.Count>0 then
     if (Listbox1.ItemIndex>=0) and (Listbox1.ItemIndex<Listbox1.Items.Count) then
       LoadListbox(Listbox1.Items[ListBox1.ItemIndex]);


  //if Listbox2.Items.Count>0 then
    //Listbox2.ItemIndex:=true;
end;


////////////////////////////////////////////////////////////////////////////////
//   добавление группы
////////////////////////////////////////////////////////////////////////////////
procedure TForm.N6Click(Sender: TObject);
  var newstr:string;
      i:integer;
      llist:tstringlist;
begin


  NewStr:=InputBox('Новая группа','Введите имя группы','');
  if newstr<>'' then begin
  Listbox1.Items.Add(newstr);

     llist:=tstringlist.create;
     llist.Clear;
   

     begin
        llist.AddStrings(Listbox1.Items);
     

       llist.SaveToFile(dir+'Listbox1.pdb');
       llist.Free;
  
end;
end;
 end;

procedure TForm.N7Click(Sender: TObject);

var i:integer;
    llist:tstringlist;
begin

  if messagedlg('Вы действительно хотите удалить группу ',mtConfirmation,[mbNo,mbYes],0)=mrYes then begin
     Listbox1.DeleteSelected;
     llist:=tstringlist.create;
     llist.Clear;
     for i:=0 to Listbox1.Items.Count-1 do begin
        llist.add(Listbox1.Items[i]);
     end;

     try
      
       llist.SaveToFile(dir+'Listbox1.pdb');
     except
      
     end;
     llist.Free;
  end;
        end;
procedure TForm.New_exe(Sender: TObject);

begin
  Application.CreateForm(TNewCat, NewCat);
  if NewCat.ShowModal=mrOk then
     if Listbox1.itemIndex>0 then
        LoadListbox(Listbox1.Items[ListBox1.ItemIndex])
     else
        LoadListbox(Listbox1.Items[ListBox1.ItemIndex]);
  NewCat.free;
end;

procedure LoadListbox(Const Groupname:string);
 var i,cur2:integer;
     lis2:tstringlist;
    
begin
  lis2:=tstringlist.Create;

 with form do begin
   Listbox2.Clear;
   try
     ini2.ReadSections(lis2);
     status.panels[1].text:=' число заисей: '+inttostr(lis2.Count);

      if Listbox1.ItemIndex=0 then begin
        for i:=0 to lis2.Count-1 do begin
           
           Listbox2.Items.Add(lis2[i]);
          end;
      end;
      if Listbox1.itemindex>0 then begin
        for i:=0 to  lis2.Count-1 do begin
          if ini2.readstring(lis2[i],'n10','')=GroupName then begin
              Listbox2.ItemIndex:=cur2;
             
             Listbox2.items[cur2]:=lis2[i];
            end;
        end;
      end;
    except
   end;
  end;
  end;
end.




unit New_Cat;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, ActnList;

type
  TNewCat = class(TForm)
    ComboBox1: TComboBox;
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    ActionList1: TActionList;
    Action1: TAction;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Action1Execute(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  NewCat: TNewCat;

implementation

uses main,cfg;

{$R *.dfm}

procedure TNewCat.Button1Click(Sender: TObject);
begin
close;
end;
procedure TNewCat.Button2Click(Sender: TObject);
var i:integer;
begin
 try
   if length(Edit1.text)>0 then begin

     main.ini2.WriteString(Edit1.text,'n10',ComboBox1.Text);

   end
   else showmessage('Необходимо ввести название категории');
 except
   // writeLog(log,'WriteError','New_Cat.Button2Click');
 end;
end;


procedure TNewCat.FormActivate(Sender: TObject);
var i:integer;
begin
 ComboBox1.Items.clear;
 for i:=1 to phoneBook.Listbox1.Items.Count-1 do begin
    ComboBox1.Items.Add(phoneBook.Listbox1.Items[phoneBook.ListBox1.ItemIndex]);
 end;


 for i:=0 to ComboBox1.Items.count-1 do
   if(phoneBook.Listbox1.ItemIndex>=0)and(phoneBook.Listbox1.ItemIndex<phonebook.Listbox1.Items.Count)then
     if ComboBox1.Items[i]=phoneBook.Listbox1.Items[phoneBook.ListBox1.ItemIndex] then
        ComboBox1.ItemIndex:=i;
 Edit1.Text:='';

end;

procedure TNewCat.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if ord(key)=vk_escape then close;
end;

procedure TNewCat.Action1Execute(Sender: TObject);
begin
  close;
end;

procedure TNewCat.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if (Key = #13) then begin
     Key:=#0;
     Perform(WM_NEXTDLGCTL,0,0);
  end;
end;


end.

Думаю, что надо поправить процедуру LoadListbox. Гляньте пожалуйста.
Ответить с цитированием
  #4  
Старый 25.04.2013, 02:06
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Лучше бы минимальный проект вместо простыней, на глаз мало что поймёшь правильно сразу, особенно когда много букофф, а в среду переносить это дело затратно по времени.

По этой причине проще было примерчик набросать, может поможет?
Вложения
Тип файла: zip lbi.zip (2.3 Кбайт, 6 просмотров)
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Corwin13 (26.04.2013)
  #5  
Старый 25.04.2013, 03:41
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

А не проще было сделать простейшую связку мастер-деталь для клиентдатасета?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 26.04.2013, 09:56
Corwin13 Corwin13 вне форума
Прохожий
 
Регистрация: 05.04.2013
Сообщения: 20
Версия Delphi: Enterprise 7.0
Репутация: 10
По умолчанию

Вот часть, про listbox.
Вложения
Тип файла: rar proba.rar (201.7 Кбайт, 2 просмотров)
Ответить с цитированием
  #7  
Старый 29.04.2013, 17:38
Corwin13 Corwin13 вне форума
Прохожий
 
Регистрация: 05.04.2013
Сообщения: 20
Версия Delphi: Enterprise 7.0
Репутация: 10
По умолчанию

А можно вместо listbox2 прикрутить listview?
Вложения
Тип файла: rar lbi.rar (228.0 Кбайт, 2 просмотров)
Ответить с цитированием
  #8  
Старый 30.04.2013, 10:56
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Corwin13
А можно вместо listbox2 прикрутить listview?
Можно, но только данная тема называется "Выделенный пункт в listbox", а с listview это совсем другая песня...
Нарушение ПФ, см. http://www.delphisources.ru/pages/forum_rules.html
Ответить с цитированием
  #9  
Старый 30.04.2013, 11:04
Corwin13 Corwin13 вне форума
Прохожий
 
Регистрация: 05.04.2013
Сообщения: 20
Версия Delphi: Enterprise 7.0
Репутация: 10
По умолчанию

Учту на будущее. Не могли бы вы посмотреть. Я в вашем примере попробовал прикрутить, но получилось не очень.
Ответить с цитированием
  #10  
Старый 30.04.2013, 11:09
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Угу, посмотрю, но отвечу в ЛС, немного погодя - последний рабочий предпраздничный день как ни как
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Corwin13 (30.04.2013)
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:33.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter