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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2007, 20:38   #1
UnDerKetzer
 
Регистрация: 19.02.2007
Сообщений: 5
По умолчанию Не могу разобраться с ComboBox

Всем доброго времени суток. Вчера взял Делфи7.0, решил потренироваться в нем (раньше Паскаль изучал). Прошу вашей помощи, ибо запутался окончательно. Вобщем, необходимо, что-бы при определённом значении ComboBox (например ItemIndex=2) в списке ListBox из 14 строк оставались определённые две, а, например, при ItemIndex=3 - другие две. У меня получилось просто оставлять строчки, однако при последующем выборе другой строки ComboBox'а ВСЕ строчки стираются (оно и понятно), т.е. необходимо начальный список забить в переменнуЮ, что-бы при каждой смене строки (ItemIndex) список заново восстанавливался и следом урезался в соответствии с текущем значением ItemIndex. Так-же интересует, как реализовать СМЕЩЕНИЕ В САМЫЙ ВЕРХ ОКОШКА оставшихся после отсеивания строк, а то, например, 1 и 2-я строки стёрлись, остались пустые места, а следом нужные мне.
Заранее благодарен за потраченное на прочтение топика время, надеюсь на поддержку.

Код:
procedure TForm1.ComboBox1Change(Sender: TObject);

var
Tip, Zamok, SchetN, SchetM: integer;
List: array[1..18] of String;
ListIndex: array [1..18] of integer;
begin


   Schetn:=0;
   Schetm:=1;
   Repeat     //Обновление списка
          SchetM:=SchetM+1;
          ListBox1.Items[schetn]:=List[schetm];
          schetN:=schetN+1;
   until schetM=18;



  Schetn:=0;    // Начальные значения
  Schetm:=0;
  Tip := ListBox1.ItemIndex;
  Zamok := ComboBox1.ItemIndex;



  Case zamok of //Зависимость списка типа

    0: begin
       Schetn:=1;
       Schetm:=1;
       //Затирание ненужных типов
          repeat
           schetn:=schetn+1;
           ListBox1.Items[schetn]:=' ';
          until schetn=18;
       end;

    1: begin
       Schetn:=0;
       Schetm:=0;
         repeat
           If schetn=2 then
              schetn:=schetn+1
           else
           ListBox1.Items[schetn]:='';
           schetn:=schetn+1;
         until schetn=18;
       end;

    2: begin
       Schetn:=0;
       Schetm:=0;
          repeat
           If schetn=4 then schetn:=schetn+1 else
           ListBox1.Items[schetn]:=' ';
           schetn:=schetn+1;
          until schetn=18;
       end;

    3: begin
       Schetn:=0;
       Schetm:=0;
          repeat
           If schetn=6 then schetn:=schetn+1 else
           ListBox1.Items[schetn]:=' ';
           schetn:=schetn+1;
          until schetn=18;
       end;




  end;

end;
UnDerKetzer вне форума Ответить с цитированием
Старый 19.02.2007, 22:33   #2
UnDerKetzer
 
Регистрация: 19.02.2007
Сообщений: 5
По умолчанию

Так. Ребята, прошу прощения за флуд, НО(!!!)
Кое-что переделал в коде, теперь необходимые строки всегда вверху, порядок выбора реализован абсолютно правильно, однако никак не могу сделать восстанавливаемый ListBox1.Items.
Если поставить камент начиная от " Zamok := ComboBox1.ItemIndex;// нач. знач." и почти до конца, то ВИДНО, что список обновляется верно. Ребята, очень прошу, помогите разобраться!!! просто я уже устал голову ломать... вроде все должно работать. =\
Вот листинг:

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Button1: TButton;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    Label1: TLabel;
    ListBox1: TListBox;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }


  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Close;
end;


procedure TForm1.ComboBox1Change(Sender: TObject);

var
Zamok, SchetN, SchetM, i: integer;
List: array[1..18] of String;
ListIndex: array [1..18] of integer;
begin

If List[1] = '' then //Внесение в массив списка
begin
Schetn:=0;
Schetm:=0;
  Repeat
    SchetM:=SchetM+1;
    List[schetm]:=ListBox1.Items[schetn];
    schetN:=schetN+1;
  until schetM=18;
end;



   Schetn:=0;
   Schetm:=0;
   Repeat     //Обновление списка
          SchetM:=SchetM+1;
          ListBox1.Items[schetN]:=List[schetM];
          schetN:=schetN+1;
   until schetN=18;


  Zamok := ComboBox1.ItemIndex;// нач. знач.
  Schetn:=1;

  Case zamok of //Зависимость списка от типа замка
      0: begin
       ListBox1.Items[0]:= List[Zamok+1];
       ListBox1.Items[1]:= List[Zamok+2];
       //Затирание ненужных строк
          repeat
           ListBox1.Items[schetn+1]:= '';
           schetn:=schetn+1;
          until schetn=17;
       end;

    1: begin
       ListBox1.Items[0]:= List[Zamok+2];
       ListBox1.Items[1]:= List[Zamok+3];
          //çàòèðàíèå íåíóæíûõ òèïîâ
          repeat
           ListBox1.Items[schetn+1]:= '';
           schetn:=schetn+1;
          until schetn=17;
       end;

..............
ТУТ ИДЕТ ПОВТОРЕНИЕ ДЛЯ КАЖДОГО ЗНАЧЕНИЯ
..............


    9: begin
       ListBox1.Items[0]:= List[Zamok+10];
       ListBox1.Items[1]:= List[Zamok+11];
          //çàòèðàíèå íåíóæíûõ òèïîâ
          repeat
           ListBox1.Items[schetn+1]:= '';
           schetn:=schetn+1;
          until schetn=17;
       end;

       
  end; //Êåéñîâñêèé åíä

end;

end.
UnDerKetzer вне форума Ответить с цитированием
Старый 20.02.2007, 09:35   #3
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

1) Вместо "array[1..18] of String" лучше использовать тип TSrtings - это и есть массив строк, в нём уже есть процедуры добавления в конец, вставки, удаления строк. Да и при использовании с ListBox проще будет

2) Если делаем через TSrtings, то создаём 2 переменные такого типа. Одна - текущая, другая - архивная. Ну а восстановление потом делается простым присваиванием
zetrix вне форума Ответить с цитированием
Старый 20.02.2007, 10:00   #4
А. Долматов
Форумчанин
 
Аватар для А. Долматов
 
Регистрация: 15.02.2007
Сообщений: 183
По умолчанию

Как я понял ты затираешь ListBox1 и хотел бы вернуться к изначальному списку, так?
Цитата:
Repeat //Обновление списка
SchetM:=SchetM+1;
ListBox1.Items[schetN]:=List[schetM];
schetN:=schetN+1;
until schetN=18;
Эту процедуру необходимо делать в самом конце, а лучше всего на кнопке Сброс или отмена. Суть в том, что ты обновляешь список только при выборе какого нить значения в ComboBox1 а где сброс, так сказать обнуление переменных?
Знать все невозможно, в силу того, что жить бы стало неинтересно.
А. Долматов вне форума Ответить с цитированием
Старый 20.02.2007, 10:54   #5
UnDerKetzer
 
Регистрация: 19.02.2007
Сообщений: 5
По умолчанию

Цитата:
Сообщение от zetrix Посмотреть сообщение
1) Вместо "array[1..18] of String" лучше использовать тип TSrtings - это и есть массив строк, в нём уже есть процедуры добавления в конец, вставки, удаления строк. Да и при использовании с ListBox проще будет
О_о как же обьявить TString? Мне делфи отвечает, что не знает такой идентефикатор. Если можно, чуточку подробнее пожалуйста.


Цитата:
Как я понял ты затираешь ListBox1 и хотел бы вернуться к изначальному списку, так?
Эту процедуру необходимо делать в самом конце, а лучше всего на кнопке Сброс или отмена. Суть в том, что ты обновляешь список только при выборе какого нить значения в ComboBox1 а где сброс, так сказать обнуление переменных?
Ты немного не так понял ) Да, мне надо вернуться к изначальному списку, НО при переходе от одной строки CombOBox'a к другой! Т.е. у меня в голове это выглядит так:

---------------------------------------------
Занесение в архив изначального списка
--------------------------------------------
Обновление списка <------------------------ |
----------------------------------------------|
определение ВыборА строки
--------------------------------------------- |
Затирание ненужных строк ListBox
--------------------------------------------- |
ВЫБОР НОВОЙ СТРОКИ------------------------

Последний раз редактировалось UnDerKetzer; 20.02.2007 в 10:58.
UnDerKetzer вне форума Ответить с цитированием
Старый 20.02.2007, 12:48   #6
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

На форме должны быть 2 кнопки и ListBox.
Для удаления строки из listBox надо написать:
ListBox1.Items.Delete(N); //N - номер удаляемой строки. (строки нумеруются с 0!)
Надеюсь всё будет понятно
Код:
unit Unit1;

interface

uses
  Windows, SysUtils, Classes, Forms, Controls, StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

var
  Form1: TForm1; A:TStrings; //наш архив массива строк

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
//задание массива строк, в данном случае просто числами
A:=TStringList.Create; //архив
for i:=0 to 9 do a.Add(inttostr(i));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ListBox1.Clear;
ListBox1.Items.AddStrings(A);//восстановление из архива
end;

end.
P.S.: желательно ещё написать A.free; перед закрытием программы - чтоб память освободить...
zetrix вне форума Ответить с цитированием
Старый 20.02.2007, 18:00   #7
UnDerKetzer
 
Регистрация: 19.02.2007
Сообщений: 5
По умолчанию

Привет всем. Уважаемый Zetrix, спасибо за помощь, однако мне она не потребовалась. У меня таки получилось разобраться самому.
Если интересно, или у кого-то тоже возникнут подобные проблмы, то рассказываю:
Дело в том, что данные окна BoxList должны были занестись в массив (если он пустой), после этого должна была пройти проверка значения ComboBox1.ItemIndex и все итемы (за исключением 2-х) должны были стереться из BoxList.
Проблема заключалась в том, что при последующей смене значения ComboBox BoxList не обновлялся, что-бы исключить в дальнейшем строки, оставив 2, соответствующие уже текущему значению ComboBox.ItemIndex, хотя я присваивал всем значениям BoxList.item значения архивного массива. Как выяснилось, неправильно обрабатывалось условия записи в массив, и при каждой смене массиву вновь и вновь присваивались значения BoxList, хотя они и были уже неверны.
На первый взгляд все было в порядке: условие проверяло размер первой строки массива, если она была пуста ( '' ), то заносил в него все значения BoxList.Item, если была не пуста, то программа шла дальше.
Однако ничего не работало!
И тут пришла одна оооочень простая мысль: а почему-бы не обьявить переменные массива и остальные в ТОПЕ программы, в самом верху, в первом VAR'e... все заработало.
Вот исходник. Спасибо тем, кто помогал мне

Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, CheckLst;
type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Button1: TButton;
    Label1: TLabel;
    ListBox1: TListBox;
    Label2: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }

  end;

var
  Form1: TForm1;
  SchetN, SchetM: integer;
  List: array[1..18] of String;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Close;
end;


procedure TForm1.ComboBox1Change(Sender: TObject);
var
Zamok: integer;
begin

Schetn:=0;
Schetm:=0;
if List[1] = '' then      // Проверка массива на "проф.пригодность"
  Repeat                  //Занесение списка в массив
    SchetM:=SchetM+1;
    List[schetm]:=ListBox1.Items[schetn];
    schetN:=schetN+1;
  until schetM=18;
Schetn:=0;
Schetm:=0;

  Zamok := ComboBox1.ItemIndex;// нач знач

  Case zamok of //Зависимость списка типа от замка

    0: begin
       //затирание ненужных типов
       ListBox1.Items.Clear;
       ListBox1.Items[0]:= List[Zamok+1];
       ListBox1.Items[1]:= List[Zamok+2];

       end;

    1: begin
       ListBox1.Items.Clear;
       ListBox1.Items[0]:= List[Zamok+2];
       ListBox1.Items[1]:= List[Zamok+3];
       end;

    2: begin
       ListBox1.Items.Clear;
       ListBox1.Items[0]:= List[Zamok+3];
       ListBox1.Items[1]:= List[Zamok+4];
       end;

///////// Тут все то-же самое ///////////////

    9: begin
       ListBox1.Items.Clear;
       ListBox1.Items[0]:= List[Zamok+10];
       ListBox1.Items[1]:= List[Zamok+11];
       end;
  end; //Кейсовский енд
end;

end.
UnDerKetzer вне форума Ответить с цитированием
Старый 21.02.2007, 07:30   #8
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Рад, что разобрались сами
zetrix вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу разобраться Var17 Общие вопросы Delphi 6 27.03.2010 01:21
Не могу внести строку из combobox в combobox!? tacer Помощь студентам 1 30.11.2007 19:45
помогите разобраться с ComboBox ByteMan Общие вопросы Delphi 1 26.06.2007 22:16